首页 > 解决方案 > 使用 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”

标签: mysqlsqlregexmariadb

解决方案


您应该认真考虑修复您的数据库设计,以不存储这样的非规范化 CSV 数据。作为临时解决方法,我们可以REGEXP_REPLACE使用FIND_IN_SET

SELECT *
FROM mytable
WHERE FIND_IN_SET(
          '456',
          REGEXP_REPLACE(concatenated_csv_values, '^.*_', '')) > 0;

此处使用的正则表达式技巧会将 CSV 输入转换texta_123,textb_456123,456. 然后,我们可以使用 轻松搜索给定的 ID FIND_IN_SET


推荐阅读