【问题标题】:REGEXP for not exist number in comma saperated string用于逗号分隔字符串中不存在数字的正则表达式
【发布时间】:2018-08-11 07:04:29
【问题描述】:

我有一个表名招标,其中包含以下详细信息:

+-------------------------------+
|  id     |    Sector           |
+-------------------------------+
|  1      |    1,3,5,9,7        |
+-------------------------------+
|  2      |    2,6,4,7,9,20     |
+-------------------------------+
|  3      |    1,2,3,55,47,52   |
+-------------------------------+
|  4      |    51,2,36,5,4,9,1  |
+-------------------------------+

我使用REGEXP 来查找使用mysql 的值

SELECT * FROM `tenders` WHERE sector REGEXP "[[:<:]]1[[:>:]]"

并设置我使用的or 条件

SELECT * FROM `tenders` WHERE sector REGEXP "[[:<:]](1|2)[[:>:]]"

但我想编写一个查询,其中扇区字段既不存在1 也不存在2。输出应包含除12 之外的每个其他扇区的扇区。

【问题讨论】:

  • 不要将值存储为 CSV。了解规范化
  • 我知道规范化,但数据库是远程连接的,无法对数据库进行任何更改。我知道我可以使用 mysql 查询获取记录,但不知道语法。请帮忙
  • 那么,对于记录 4,您希望它输出 51,36,5,4,9?
  • 是的@sloan thrasher,你是对的
  • 运行查询后,您可以在 PHP 代码中轻松完成此操作。

标签: php mysql regex mysqli


【解决方案1】:

感谢您的回答。

其实很容易得到输出。

我刚刚写了这样的查询

SELECT * FROM `tenders` WHERE sector NOT REGEXP "[[:<:]](1|2)[[:>:]]"

我得到了输出。

【讨论】:

  • 这实际上与您在回答@SloanThrasher 问题“因此,对于记录 4,您希望它输出 51,36,5,4,9”中所写的内容不匹配。其他答案尝试解决这个问题。
【解决方案2】:

这里不需要正则表达式,只需用逗号将Sector 列包裹起来,因此列表中的每个数字都在逗号之间,然后您可以通过查找,[number], 轻松检查是否存在某个数字(例如.,1,) 在连接列中。

这里是查询:

select id,
       Sector
from tbl
where locate(',1,', concat(',', Sector,',')) = 0 --1 is not in the list
  and locate(',2,', concat(',', Sector,',')) = 0 --and 2 is not in the list

Demo

【讨论】:

    【解决方案3】:

    根据您的 MySQL 版本,您可以使用 REGEXP_REPLACEREGEXPTRIMCONCAT 可以解决问题(基于 12):

    如果您使用的是 MySQL >= 8.0,您可以使用REGEXP_REPLACE 函数:

    SELECT id, 
    TRIM(BOTH ',' FROM REGEXP_REPLACE(CONCAT(',',Sector,','),'(,1)|(,2)','')) 
    FROM tenders;
    

    对于 MySQL Mysql 你可以使用REPLACE 函数。

    SELECT id, 
    TRIM(BOTH ',' FROM REPLACE(REPLACE(CONCAT(',',Sector, ','),',2',''),',1','')) 
    FROM tenders;
    

    You can see a working example on DB Fiddle

    【讨论】:

    • 这将替换例如24 和 4 并将以 2 结尾的数字(例如 32)与列表中的下一个数字合并。
    • 你是对的@Nick,我使用 REGEXP_REPLACE 更改了我的答案
    • @Nick 我还添加了一个使用 REPLACE 函数的工作示例。
    • 其实不是只有1和2可能有任何数字。而且查询起来似乎很复杂。
    • @HarshwardhanSharma 我只是简化了我的答案。对于 MySQL 8 或更高版本,您可以通过简单的方式添加更多数字,但我同意 MySQL
    【解决方案4】:
    WHERE NOT FIND_IN_SET(1, sector)
      AND NOT FIND_IN_SET(2, sector)
    

    性能:对于 2 个项目,它可能与 NOT REGEXP 大致相同。对于超过 2,它可能会更慢。涉及CONCAT 的技术会比较慢。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-09-20
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多