如何从含逗号分隔多值列的数据库表中查询指定标签数据?
我有一个名为abc_table的表,结构与数据如下:
| Id | Name | Tags |
|---|---|---|
| 1 | abc | 1,4,5 |
| 2 | aef | 11,14,55 |
| 3 | xyz | 1,44,9 |
| 4 | demo | 1,98,4 |
我需要查询其中同时包含标签1和4,或者包含标签1或4的name字段。我尝试过使用SQL的LIKE运算符,也试过REGEX,但都未得到预期结果。我使用的SQL语句如下:
SELECT ad.name, ad.tags FROM abc_table ad AND CONCAT(',', ad.tags, ',') IN (',1,4,')
该语句仅能返回第一行数据,无法返回第四行数据,因为1和4之间存在98。
一、查询同时包含标签1和4的记录
你的IN用法错误,IN(',1,4,')只会精确匹配,1,4,字符串,而第四行处理后是,1,98,4,,自然匹配不上。正确做法是分别校验两个标签是否存在:
SELECT ad.name, ad.tags FROM abc_table ad WHERE CONCAT(',', ad.tags, ',') LIKE '%,1,%' AND CONCAT(',', ad.tags, ',') LIKE '%,4,%';
这条语句会返回Id为1、4的两条记录,它们同时包含1和4标签。
如果你的数据库支持正则,也可以用以下写法:
-- MySQL SELECT ad.name, ad.tags FROM abc_table ad WHERE CONCAT(',', ad.tags, ',') REGEXP ',1,' AND CONCAT(',', ad.tags, ',') REGEXP ',4,'; -- PostgreSQL SELECT ad.name, ad.tags FROM abc_table ad WHERE CONCAT(',', ad.tags, ',') ~ ',1,' AND CONCAT(',', ad.tags, ',') ~ ',4,';
二、查询包含标签1或4的记录
把上面的AND替换成OR即可:
SELECT ad.name, ad.tags FROM abc_table ad WHERE CONCAT(',', ad.tags, ',') LIKE '%,1,%' OR CONCAT(',', ad.tags, ',') LIKE '%,4,%';
这条语句会返回Id为1、3、4的记录,它们包含1或者4标签。
正则版本:
-- MySQL SELECT ad.name, ad.tags FROM abc_table ad WHERE CONCAT(',', ad.tags, ',') REGEXP ',1,|,4,'; -- PostgreSQL SELECT ad.name, ad.tags FROM abc_table ad WHERE CONCAT(',', ad.tags, ',') ~ ',1,|,4,';
补充说明
用CONCAT(',', ad.tags, ',')是为了避免误匹配,比如第二行的11,14,55不会被当成包含1或4的记录。
内容的提问来源于stack exchange,提问作者Sanjay Singh
相关产品推荐
相关产品推荐

