我在表格的某些字段中有一个数字列表,例如:
2033,1869,1914,1913,19120,1911,1910,1909,1908,1907,1866,1921,1922,1923
现在,我尝试进行查询以检查行中是否找到了数字,但是,我无法使用LIKE
,因为它可能会返回误报,就好像我在上面的字段中搜索了1912
我会因为数字19120
而返回结果,显然我们不希望这样 - 我们无法附加或添加逗号因为开始/结束号码没有它们。
所以,使用REGEXP
我去了......我试过了,但它没有用(它返回一个结果):
SELECT * FROM cat_listing WHERE cats REGEXP '[^0-9]*1912[^0-9]*';
我想象为什么它仍然会发现某些东西是因为*
量词;它发现[^0-9]
0次 AFTER 1912
因此它认为它匹配。
我不确定如何修改它以做我想做的事。
答案 0 :(得分:2)
在您的情况下,似乎词边界是必要的:
SELECT * FROM cat_listing WHERE cats REGEXP '[[:<:]]1912[[:>:]]';
[[:<:]]
是单词的开头,[[:>:]]
是结尾。见reference:
[[:<:]], [[:>:]]
这些标记代表字边界。它们分别匹配&gt;单词的开头和结尾。单词是一系列单词字符,其不是>前面或后面是单词字符。单词字符是alnum类中的字母数字&gt;字符或下划线(
_
)。
答案 1 :(得分:2)
您有另一个名为find_in_set()
的选项SELECT * FROM cat_listing WHERE find_in_set('1912', cats) <> 0;
如果str不在strlist中,或者strlist是空字符串,则返回0。如果任一参数为NULL,则返回NULL。如果第一个参数包含逗号(“,”)字符,则此函数无法正常工作。
答案 2 :(得分:1)
不需要使用正则表达式只是因为列值在任何一端都没有逗号:
SELECT
cats
FROM cat_listing
WHERE INSTR(CONCAT(',', cats, ','), ',1912,')
;
查看实际操作:SQL Fiddle 如果需要调整/更详细,请发表评论。