如何对存储逗号分隔值的字段执行带筛选条件的SELECT查询
现有写法的问题
你当前写的SQL存在两个核心错误:
LIKE没有搭配通配符%,你写的LIKE "Admin"||"Accounts"等同于精确匹配AdminAccounts这个完整字符串,完全匹配不到表中的任何部门数据- 你主动限定了部门必须包含
Accounts,会漏掉只有Admin权限的User2,不符合你的筛选需求
正确的LIKE写法
推荐给字段前后拼接逗号后再匹配,能避免出现AdminDemo这类包含Admin前缀的部门被误匹配的问题,不同数据库的字符串拼接语法略有差异:
适配Oracle/PostgreSQL(使用||作为拼接符)
SELECT "User" FROM Details WHERE ',' || Department || ',' LIKE '%,Admin,%' AND ',' || Department || ',' NOT LIKE '%,Finance,%';
适配MySQL(使用CONCAT函数拼接)
SELECT `User` FROM Details WHERE CONCAT(',', Department, ',') LIKE '%,Admin,%' AND CONCAT(',', Department, ',') NOT LIKE '%,Finance,%';
如果你能确定不存在名称包含Admin/Finance的其他部门,也可以用更简单的通配符写法:
SELECT "User" FROM Details WHERE Department LIKE '%Admin%' AND Department NOT LIKE '%Finance%';
额外建议
这种把多值用逗号分隔存在单列的设计不符合关系数据库的范式要求,查询效率低还容易出现匹配错误,如果有条件的话建议拆为多对多关联表存储用户和部门的对应关系,后续维护会方便很多。
内容的提问来源于stack exchange,提问作者Sid133
相关产品推荐
相关产品推荐

