我可以搜索1 AND 2 AND 3而不会得到错误的匹配,因为11,22,33在该字段中吗?
具有string =“11,22,33”的字段不应返回任何结果。
答案 0 :(得分:2)
使用正则表达式匹配正则表达式(^|,)1($|,)
和(^|,)2($|,)
以及(^|,)3($|,)
答案 1 :(得分:2)
首先,在字段中使用逗号分隔值是有问题的,您应该考虑将它们存储在sepatate表中。然后你可以更有效地获得记录:
select ...
from mainTable t
inner join valueTable v1 on v1.id = t.id and v1.value = 1
inner join valueTable v2 on v2.id = t.id and v2.value = 2
inner join valueTable v3 on v3.id = t.id and v3.value = 3
如果不可能,你必须采用慢速字符串匹配方式。要匹配逗号分隔字符串中的值,可以使用like
运算符:
... where
concat(',', someField, ',') like '%,1,%' and
concat(',', someField, ',') like '%,2,%' and
concat(',', someField, ',') like '%,3,%'
将分隔符放在搜索值的两侧,可确保不会出现任何误报。在字段值之前和之后添加逗号可确保您可以找到第一个和最后一个值。
答案 2 :(得分:1)
您是否考虑过在您的情况下对值11的最佳搜索是什么?
由于无法缩小搜索范围,因此注定要执行表扫描以查找相关值。
您应该认真考虑将这些值拆分为单独的表,每个值都有一行,所有这些都链接回原始表中的原始行。
这将更加正确,性能更高,更易于处理。
话虽如此,如果你仍想使用当前的方法,你可以通过这样做来搜索一个值:
WHERE ','+ column + ',' LIKE '%,' + value + ',%'
这将搜索',11,22,33,'
'%,11,%'
,注意列和值的每一端的逗号,这样可以确保您不会因部分匹配而产生误报。
答案 3 :(得分:0)
http://dev.mysql.com/doc/refman/5.0/en/string-functions.html#function_find-in-set
FIND_IN_SET(1,column) AND FIND_IN_SET(3,column) AND etc;
它设计用于SET类型,但它也适用于基本的逗号分隔列表。