mysql - 在 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 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
推荐阅读
- javascript - chart.js:连接两个折线图的问题
- .htaccess - 如何强制将 http 和 www 重定向到 https
- javascript - 带有 CDN 的 Vue - 设置组件样式的最佳方式
- windows - 我们可以在复制过程中打开 Robocopy 日志吗?
- python - Floyd-Warshall 到 Graph networkx
- ios - 如何检查 nil 是否已经强制向下转换的属性
- r - 为什么向量没有用新值更新
- teradata - 自动提交 Teradata SQL 助手
- android - 没有为多个单词设置可点击跨度
- c# - 基准点网。是否可以包括未预热的结果?