首页 > 解决方案 > 在 WHERE 子句中替换非数字值和 MATCH

问题描述

我有一个这样的查询:

SELECT * FROM `mytable` WHERE `code` LIKE 'PR-SM' AND number = '45'

然而,在某些情况下,数字可能PR45会失败。我尝试了以下方法:

SELECT * FROM `mytable` WHERE `code` LIKE 'PR-SM' AND CAST(number as unsigned) = '45'

SELECT * FROM `mytable` WHERE `code` LIKE 'PR-SM' AND CONVERT(number as unsigned) = '45'

SELECT * FROM `mytable` WHERE `code` LIKE 'PR-SM' AND number LIKE '%45'

LIKE %将无法正常工作,因为它也会拾取 145。

REGEXP_REPLACE也不能像我一样工作MySQL 5.7

这是我的 API 所必需的,因为我的设置需要能够在 where 子句中完成。

样品表:

+--------------------------+
| code       | number      |
+--------------------------+
| PR-SM      |  PR45       |
+--------------------------+
| PR-SM      |  PR145      |
+--------------------------+
| XYZ        |  177        |
+--------------------------+
| XYZ        |  81         |
+--------------------------+

标签: mysql

解决方案


虽然您没有使用 MySQL 8+,这意味着您将无法访问较新的正则表达式函数,但 5.7 上REGEXP应该仍然可用:

SELECT *
FROM yourTable
WHERE code = 'PR-SM' AND number REGEXP '(^|[^0-9])45([^0-9]|$)';

演示

此处使用的正则表达式模式表示匹配:

(^|[^0-9])  match the start of the input OR a non digit
45          match the number 45
([^0-9]|$)  match the end of the input OR a non digit

推荐阅读