【问题标题】:match a number using regex for comma separated number使用正则表达式匹配以逗号分隔的数字的数字
【发布时间】:2020-03-19 18:45:22
【问题描述】:

我有一个字符串,其中包含用逗号分隔的数字,如下所示。

15,22,20,26,33,445,40,44,22,225,115,2

我想知道15 是否在该字符串中。

问题是15115 都是匹配的。

相同对于其他数字,例如 2,对于这种情况,2025225 是匹配的。

对于这两种情况,只有在存在 152 时才应该返回字符串。

我尝试使用 like 关键字,但它不起作用。它还返回带有11520, 225, 222

同时分别匹配15 and 2 的行。

谁能建议regex 模式?

更新

我有一个类似下面的查询,我在其中使用 like 关键字,但由于上述原因,我得到了错误的结果。

SELECT DISTINCT A.id,A.title,A.title_hi,A.cId,B.id as cid1,A.report_type ,A.icon_img_url, A.created_at , A.news_date 
FROM tfs_report_news A, tfs_commodity_master B
WHERE (',' + RTRIM(A.cId) + ',') LIKE ('%,' + B.id + ',%')
AND A.ccId = B.ccId AND A.`report_type`= "M" 
AND A.isDeleted=0 AND A.isActive=1 AND B.isDeleted=0 
AND B.status=1 
AND A.news_date= (SELECT MAX(T.news_date) 
FROM tfs_report_news T WHERE (',' + RTRIM(T.cId) + ',') 
LIKE ('%,' + B.id + ',%'))
ORDER BY created_at desc, id desc limit 100;



这里tfs_report_news 有字符串15,22,20,26,33,445,40,44,22,225,115,2 作为列名

cId 和个别cId152idtfs_commodity_master

【问题讨论】:

  • 修复你的数据模型!不要将数字存储为字符串!不要在一个字符串列中存储多个值!
  • 我知道@GordonLinoff。这是架构中的设计缺陷,但我无法在那里进行任何更改。这是一个老应用程序,很多业务逻辑都依赖于这个表架构。

标签: mysql sql regex csv select


【解决方案1】:

在MySQL中,你问的是string function find_in_set()的用途:

如果字符串str 在由N 子字符串组成的字符串列表strlist 中,则返回1N 范围内的值。字符串列表是由, 字符分隔的子字符串组成的字符串 [...] 如果str 不在strlist 中或strlist 是空字符串,则返回0。如果任一参数为 NULL,则返回 NULL

所以要检查列表中是否存在值,您可以这样做:

find_in_set('15', '15,22,20,26,33,445,40,44,22,225,115,2') > 0

旁注:here 是推荐阅读。

【讨论】:

    【解决方案2】:

    使用FIND_IN_SET:

    SELECT
        CASE WHEN FIND_IN_SET('15', csv) > 0 THEN 'yes' ELSE 'no' END AS result
    FROM yourTable;
    

    另一种选择是使用LIKE

    SELECT
        CASE WHEN CONCAT(',', csv, ',') LIKE '%,15,%' THEN 'yes' ELSE 'no' END AS result
    FROM yourTable;
    

    最后,你也可以在这里使用REGEXP

    SELECT
        CASE WHEN csv REGEXP '[[:<:]]15[[:>:]]' THEN 'yes' ELSE 'no' END AS result
    FROM yourTable;
    

    【讨论】:

    • 请您解释一下'[[:&lt;:]]15[[:&gt;:]]'
    • 请注意 MySQL 8.0.4 更改了他们的正则表达式库,其结果之一是不再支持 [[:&lt;:]] 语法。您必须使用\\b 作为单词边界。有关其他更改,请参阅 dev.mysql.com/doc/refman/8.0/en/…
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-07-16
    • 1970-01-01
    • 1970-01-01
    • 2010-12-06
    • 2021-05-31
    • 1970-01-01
    • 2012-08-23
    相关资源
    最近更新 更多