在我的表的一个列中(比如说它被称为foo
),它存储了一组 10 个数字,例如:
1, 5, 8, 3, 4, 6, 9, 7, 12, 15
我希望选择我的表格中列中有数字的所有6
行foo
。
好吧,您可能会说,这听起来很简单,只需对列进行字符串搜索即可。但问题是,您还可以选择16
其中包含的行,因为16
包含6
.
我也考虑过搜索, 6,
,但我意识到如果6
它位于字符串的末尾或前面,它将不匹配。
我该如何克服这个问题?
使用名为FIND_IN_SET
.
SELECT *
FROM tablename
WHERE FIND_IN_SET('6', REPLACE(foo,' ','')) > 0
从文档:
如果字符串 str 在由 N 个子字符串组成的字符串列表 strlist 中,则返回 1 到 N 范围内的值。字符串列表是由以“,”字符分隔的子字符串组成的字符串。如果第一个参数是一个常量字符串,而第二个参数是一个 SET 类型的列,则 FIND_IN_SET() 函数被优化为使用位算术。 如果 str 不在 strlist 中或 strlist 是空字符串,则返回 0。 如果任一参数为 NULL,则返回 NULL。如果第一个参数包含逗号 (“,”) 字符,此函数将无法正常工作。
', '
您可以在开头和结尾附加 afoo
并搜索:
SELECT *
FROM bar
WHERE ', ' + foo + ', ' LIKE '%, 6, %'