You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何从含逗号分隔多值列的数据库表中查询指定标签数据?

我有一个名为abc_table的表,结构与数据如下:

IdNameTags
1abc1,4,5
2aef11,14,55
3xyz1,44,9
4demo1,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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.02 22:32:19