查找包含特定数字的行

时间:2019-11-02 18:28:27

标签: mysql sql regex

我想从SELECT WHERE 子句返回结果,该子句查找精确数字的匹配项-以此为例,如果以9为例,我的意思是数字9,而不是29,其中包括数字9。

想象一下带有varchar列的表中的以下文本值...

  • 第12个样本
  • 第9个样本
  • 999
  • 一些文字9
  • 9a

为澄清起见,数字可能位于字符串的开头,也可能不在字符串的开头,无论哪种情况,查询都应该找到它。

重要的是,如果其他字符(例如字母和符号)位于所需数字的旁边,则查询可以正常工作。以9为例,查看上方列表中的5行将表示列表项2、4和5是有效的。

示例3无效-如果我使用 LIKE 子句,则自然会返回我不希望的示例3。

我认为LOCATE(9,COLUMN_NAME)可以工作,但它与LIKE子句存在相同的问题。

如果仅使用正则表达式可以解决此问题,那么有人可以建议它是什么吗?我有等效的PHP:

/\d+/

...但是不确定如何为MySQL重写它。

2 个答案:

答案 0 :(得分:1)

您可以使用这样的正则表达式:

SELECT *
FROM (
    SELECT 'a sample 12th' AS col UNION ALL
    SELECT '9th' UNION ALL
    SELECT '999' UNION ALL
    SELECT 'some text 9' UNION ALL
    SELECT '9a' UNION ALL
    SELECT 'foo9bar' UNION ALL
    SELECT 'foo99bar' 
) AS t
WHERE col REGEXP '([[:<:]]|[^[:digit:]])9([^[:digit:]]|[[:>:]])'

regexp手段9被非数字或单词边界包围,因此例如它将匹配foo9bar但不匹配foo99bar

答案 1 :(得分:0)

使用2个条件非常简单

select * from label where v like '%9%'and v not regexp '9[0-9]*9' ;

其他示例:如果您要在每个位置后面都没有9的位置查找9

select * from label where v regexp '^\(.*[^9]\)?9\([^9].*\)?$' ;

其他示例:您正在第一个位置寻找9

select * from label where v regexp '^9\([^9].*\)?$' ;

受问题和评论启发的sqlfiddle

http://sqlfiddle.com/#!9/da68d6/1

链接到文档 https://dev.mysql.com/doc/refman/5.7/en/regexp.html#operator_regexp