我有一个字符串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)
我该怎么做?
答案 0 :(得分:3)
首先,一个重要建议:不在数据库的列中存储逗号分隔的字符串。它使得处理变得更加困难。您应该考虑创建一个单独的关键字表,并在id列上的表上有一个外键。
您可以将字符串转换为ARRAY并执行重叠操作。但是,要按值检查值,您需要UNNEST
进行比较。
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'];
重叠运算符&&
检查从关键字列表创建的数组是否包含右侧数组中的元素。