在MySQL中使用REGEXP在逗号分隔列表中查找某个数字

时间:2015-06-28 18:04:25

标签: mysql sql regex

我在表格的某些字段中有一个数字列表,例如:

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因此它认为它匹配。

我不确定如何修改它以做我想做的事。

3 个答案:

答案 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 如果需要调整/更详细,请发表评论。