【问题标题】:finding a number in space separated list with REGEXP使用 REGEXP 在空格分隔列表中查找数字
【发布时间】:2013-12-29 10:36:07
【问题描述】:

我正在编写一个 SQL 查询来选择行,其中空格分隔数字的字段包含一个数字,在本例中为 1。

示例字段:

  • "1 2 3 4 5 11 12 21" - 匹配,包含第一名
  • "2 3 4 6 11 101" - 不匹配,不包含第一名

目前最好的查询是:

$sql = "SELECT * from " . $table . " WHERE brands REGEXP '[/^1$/]' ORDER BY name ASC;";

问题是这个REGEXP 也找到了 11 个匹配项

我在其他帖子上阅读了很多建议,例如[\d]{1},但结果总是相同的。 是否有可能完成我想要的,以及如何?

【问题讨论】:

    标签: mysql sql regex


    【解决方案1】:

    你不需要正则表达式:你可以使用LIKE,如果你在列的前后添加一个空格:

    SELECT * from $table
    WHERE CONCAT(' ', brands, ' ') LIKE '% 1 %'
    ORDER BY name
    

    【讨论】:

    • 应该在某个地方放一两个通配符吗?
    • @mihai 啊是的。哎呀!现已修复。
    • 就我而言,由于规模小,它并不那么重要。但一般来说,哪种方法效率更高?
    • @lex 正则表达式方法是最有效的。这个答案比使用 find_in_set() 更有效
    【解决方案2】:

    试试:

    WHERE brands REGEXP '[[:<:]]1[[:>:]]'
    

    [[:&lt;:]][[:&gt;:]] 匹配单词前后的单词边界。

    【讨论】:

    • [[:&lt;:]]/[[:&gt;:]]\b有什么区别?
    • MySQL 在其正则表达式语言中没有 \b。见dev.mysql.com/doc/refman/5.1/en/regexp.html
    • 这证实了我之前的想法和计划,我需要更仔细地研究 REGEXP。可以这么说,我做了 RTFM,但更多的是在 .htaccess 中使用它。例如,我不知道在 MySQL 和其他语言中的使用之间存在差异。
    • 不幸的是,几乎每个使用正则表达式的应用程序都存在一些差异。
    【解决方案3】:

    为什么不FIND_IN_SET() + REPLACE()

    SELECT 
        *
    FROM
        `table`
    WHERE
        FIND_IN_SET(1, REPLACE(`brands`, ' ', ','))
    ORDER BY
        `name` ASC;
    

    【讨论】:

      猜你喜欢
      • 2013-12-10
      • 2014-05-02
      • 1970-01-01
      • 2021-07-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多