在postgresql中以逗号分隔的列检查逗号分隔的字符串

时间:2018-05-20 07:24:15

标签: sql postgresql

我有一个字符串searchval = "php,java,html"

我想检查下表中列关键字中存在的字符串中的任何逗号分隔值。

我的表

id     keyword
-----------------------------
1      java,php
2      jquery, javascript
3      java
4      php,jquery

任何searchval(逗号分隔)值与关键字(逗号分隔)匹配都应返回id。

所以结果应该是:

1 (java,php is there),
3 (java is there),
4 (php is there)

我该怎么做?

2 个答案:

答案 0 :(得分:3)

首先,一个重要建议:在数据库的列中存储逗号分隔的字符串。它使得处理变得更加困难。您应该考虑创建一个单独的关键字表,并在id列上的表上有一个外键。

您可以将字符串转换为ARRAY并执行重叠操作。但是,要按值检查值,您需要UNNEST进行比较。

SQL Fiddle

PostgreSQL 9.6架构设置

CREATE TABLE t
    (id int, keyword varchar(18))
;

INSERT INTO t
    (id, keyword)
VALUES
    (1, 'java,php'),
    (2, 'jquery, javascript'),
    (3, 'java'),
    (4, 'php,jquery')
;

查询1

SELECT id, 
       string_agg(lang, ',') AS keyword 
FROM   t, 
       unnest(string_to_array(keyword, ',')) AS k(lang) 
WHERE  lang = ANY ( string_to_array('php,java,html', ',') ) 
GROUP  BY id 
ORDER  BY id

<强> Results

| id |  keyword |
|----|----------|
|  1 | java,php |
|  3 |     java |
|  4 |      php |

答案 1 :(得分:3)

您可以轻松地将逗号分隔列表转换为数组,然后使用Postgres&#39; array functions来测试遏制:

select id
from the_table
where string_to_array(keyword,',') && array['php','java','html'];

重叠运算符&&检查从关键字列表创建的数组是否包含右侧数组中的元素。

在线示例:http://rextester.com/VNWP17762