mysql - 查找包含特定数字的行
问题描述
我想从 SELECT WHERE子句中返回结果,该子句找到精确数字的匹配项 - 以此为例,如果以 9 为例,我的意思是数字 9,而不是包括数字 9 的 29。
想象一下具有 varchar 列的表中的以下文本值...
- 样品 12th
- 第 9 个样本
- 999
- 一些文字 9
- 9a
澄清一下,数字可能在字符串的开头,也可能不在,无论哪种情况,查询都应该找到它。
如果其他字符(例如字母和符号)位于所需数字旁边,则查询可以正常工作,这一点很重要。以 9 为例,查看上面列表中的 5 行,这意味着列表项 2、4 和 5 是有效的。
样本 3 无效 - 如果我要使用LIKE子句,样本 3 自然会被返回,这是我不想要的。
我认为 LOCATE(9,COLUMN_NAME) 可能有效,但它与 LIKE 子句有相同的问题。
如果它只是一个正则表达式来解决这个问题,有人可以建议它会是什么吗?我有 PHP 等价物:
/\d+/
...但不确定如何为 MySQL 重写它。
解决方案
您可以使用这样的正则表达式:
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
。
推荐阅读
- php - php sha256 今天(2019 年 5 月)安全吗?
- c# - C# WPF DataGrid 虚拟化很慢
- python - 如何使用带有公钥文件的 Paramiko 访问远程服务器
- php - 使用 laravel 5 插入表单数据时发布 500(内部服务器错误)
- ruby-on-rails - 如何在mailboxer_notifications 表中设置user_type?
- authentication - Keycloak Java Servlet 适配器示例或代码块
- python - 我如何评估 StratifiedKFold 模型
- php - 如何将基本站点 URL id 访问到 ajax 并使用 Codeigniter 传递给控制器?
- reactjs - 有人可以解释这段代码发生了什么吗?函数名后面的<>是什么?
- spring-boot - 使用 oauth2 提供身份验证时从 swagger 响应中获取 401 错误状态