首页 > 解决方案 > 查找包含特定数字的行

问题描述

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

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

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

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

样本 3 无效 - 如果我要使用LIKE子句,样本 3 自然会被返回,这是我不想要的。

我认为 LOCATE(9,COLUMN_NAME) 可能有效,但它与 LIKE 子句有相同的问题。

如果它只是一个正则表达式来解决这个问题,有人可以建议它会是什么吗?我有 PHP 等价物:

/\d+/

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

标签: mysqlsqlregex

解决方案


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

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:]]|[[:>:]])'

正则表达式意味着 9 被非数字或单词边界包围,因此例如它将匹配foo9bar但不匹配foo99bar


推荐阅读