mysql - 使用 MYSQL/MariaDB 和 REGEXP_SUBSTR 匹配逗号分隔后的数字值,通过下划线值连接
问题描述
我的字段列值存储如下:
texta_123,textb_456
我的 SQL:
SELECT *
FROM mytable
WHERE 456 = REGEXP_SUBSTR(mytable.concatenated_csv_values, 'textb_(?<number>[0-9]+)')
注意:我知道有多种方法可以做到这一点,但出于示例的目的,我大大简化了我的查询;我需要工作的部分是REGEXP_SUBSTR()
实际上,我想:“查询结果,其中 id 等于在具有逗号分隔值的列中的下划线之后提取的数值”
当我测试我的 Regex时,它似乎工作正常。
但是,在 MySQL 中(从技术上讲,我使用的是 MariaDB 10.4.19),当我运行查询时,我收到一条警告:“警告:#1292 截断不正确的整数值:textb_456”
解决方案
您应该认真考虑修复您的数据库设计,以不存储这样的非规范化 CSV 数据。作为临时解决方法,我们可以REGEXP_REPLACE
使用FIND_IN_SET
:
SELECT *
FROM mytable
WHERE FIND_IN_SET(
'456',
REGEXP_REPLACE(concatenated_csv_values, '^.*_', '')) > 0;
此处使用的正则表达式技巧会将 CSV 输入转换texta_123,textb_456
为123,456
. 然后,我们可以使用 轻松搜索给定的 ID FIND_IN_SET
。
推荐阅读
- c - 如果在 Intel Skylake CPU 上调用函数,为什么我的空循环运行速度会快两倍?
- javascript - Sequelize 在创建新模型时包含关联
- ios - iOS 上长按推送通知的可扩展消息
- clojurescript - 如何在对讲机上向公司添加联系人
- excel - 使用 VB 模块在 MS Excel 中重复行
- javascript - 移动鼠标,但仅在 div 的宽度上
- rvm - rvm安装编译问题
- javascript - 如何隐藏此 jquery 代码的加载更多按钮
- python - Python - 希望使用切片删除剩余的字符串
- r - 如何制作可以在 RMarkdown 中手动滚动的目录?