【问题标题】:MySQL: Usage of 'REGEXP' instead of 'FIND_IN_SET'MySQL:使用“REGEXP”而不是“FIND_IN_SET”
【发布时间】:2014-02-03 12:35:27
【问题描述】:

我在使用 MySQL 的 FIND_IN_SET 函数搜索集合中的数组时遇到了限制。因此考虑使用REGEXP。但是任何人都可以帮助我构建它。

例如我的要求

SELECT * FROM table AS t WHERE FIND_IN_SET('1,2,3', t.list);

因此考虑使用 REGEXP 函数在集合中搜索数组。

SELECT * FROM table AS t WHERE t.list REGEXP '1,2,3';

谁能帮我构建这个 REGEXP。

【问题讨论】:

  • 试试这个SELECT * FROM table AS t WHERE t.list REGEXP {1,2,3}
  • 我试过了,但没有用。
  • 我已经发布了一个答案试试

标签: mysql regex find-in-set


【解决方案1】:

你可以这样做:

SELECT * FROM table AS t WHERE t.list REGEXP '^9,|,9$|,9,' OR t.list =9

【讨论】:

    【解决方案2】:

    您可以拆分搜索字符串并继续使用FIND_IN_SET()

    SELECT * 
      FROM `table` AS t 
     WHERE FIND_IN_SET('1', t.list)
       AND FIND_IN_SET('2', t.list)
       AND FIND_IN_SET('3', t.list)
    

    通过引入多对多表更好地规范化您的数据。

    【讨论】:

    • 我曾想过以这种方式使用FIND_IN_SET,但它需要在MySQL之外进行额外的编码来乘以函数的次数和值的出现。
    • 如果我遇到需要我匹配 500 个值的情况,它会使查询变得很重,REGEXP 不是一个合适的解决方案吗?
    • 所有的沉重都是由于设计不当造成的。 REGEXP 不会让您更轻松。在这种情况下,REGEXP 不会更好,您仍然需要拆分查询字符串。在这两种情况下,您总是会对您的表进行全面扫描。如果您需要匹配 500 个值而不是创建临时表,请插入这些值并使用 FIND_IN_SET() 与您的表连接。但是,您真正应该做的是规范化您的架构。
    • 我知道标准化是要走的路。但是我正在使用的表进一步用于在不同的模块中进行搜索,并且规范化会减慢它的速度,因此我们采用了非规范化并将值保存为与 , 连接的想法
    【解决方案3】:

    根据您的要求,您可以轻松使用:

    SELECT * 
    FROM table1 AS t 
    WHERE t.list REGEXP '1|2|3';
    

    要了解正则表达式,请查看此软件: http://www.weitz.de/regex-coach/

    【讨论】:

    • 是的,我在想同一行,但是 | 将匹配 EITHER OR 模式。有没有办法确保所有的值都存在
    【解决方案4】:

    试试闲置的 sql 语句:

    SELECT * 
    FROM table AS t 
    WHERE t.list REGEXP '^(1$|2$|3$)';
    

    【讨论】:

    • t.list 包含什么??
    • 它包含像1,2,3,4,5,6,7这样的值
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-11-24
    • 2017-02-11
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多