如何选择使用逗号分隔值的交集?

时间:2017-05-04 05:21:23

标签: mysql sql

我有一个列包含以逗号分隔的值。

1,2,3
4,6,7
2,3,8
12234,5467,232445,232455,11223

给定数组的标准(例如,1,4,9),

如何选择值包含任何给定值的行?

我的意思是当我获得1,4,9时,我需要选择

1,2,3 -- has 1
4,6,7 -- has 4

更新

我有一个表,其中包含一列逗号分隔的其他实体的主键值。 我理解原始表设计师之所以这样做的原因。 其他实体实际上驻留在其他数据库中,这意味着不可连接。或者他或她只是想这样做。

学生表

id     name     classes
---------------------------
1      John     1,2,3
2      Jane     2,8,233423423

标准

使用逗号分隔的班级编号,找到参加其中任何一个的学生。

given: 1           -> select John
given: 233423423   -> select Jane
given: 1,233423423 -> select Both

2 个答案:

答案 0 :(得分:1)

如果你有一个输入1,4,9,你必须找到以逗号分隔的列表中出现1,4或9中任何一行的行?

SELECT ...
FROM MyTable
WHERE FIND_IN_SET(1, mycolumn) 
OR FIND_IN_SET(4, mycolumn) 
OR FIND_IN_SET(9, mycolumn)

有关此功能的信息,请参阅https://dev.mysql.com/doc/refman/5.7/en/string-functions.html#function_find-in-set

这应该向您说明,当您希望将列表的元素视为离散值时,存储逗号分隔列表对于关系数据库不是一个好主意。

另请参阅我对Is storing a delimited list in a database column really that bad?

的回答

答案 1 :(得分:1)

您可以将动态模板用于正则表达式。例如:

SET @Criteria='1,4,9';
SELECT `name` 
FROM STUDENT 
WHERE STUDENT.classes REGEXP concat('(^|,)(', REPLACE(@Criteria, ',', '|'), ')(,|$)');