REGEXP表示逗号分隔的字符串中不存在的数字

时间:2018-08-11 07:04:30

标签: php mysql regex mysqli

我有一个表格名称的标书,其中包含以下详细信息:

+-------------------------------+
|  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以外的其他所有扇区。

4 个答案:

答案 0 :(得分:1)

感谢您的回答。

实际上,获得输出是如此容易。

我只是这样写查询

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

我得到了输出。

答案 1 :(得分:0)

根据您的MySQL版本,您可以使用REGEXP_REPLACEREGEXPTRIMCONCAT将达到目的(基于12):

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

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

对于MySQL Mysql <8.0 ,您可以使用REPLACE函数。

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

You can see a working example on DB Fiddle

答案 2 :(得分:0)

这里不需要正则表达式,只需将Sector列用逗号括起来,这样列表中的每个数字都在逗号之间,然后可以通过查找{{1 }}(例如,[number],)在连接列中。

这里的查询:

,1,

Demo

答案 3 :(得分:0)

WHERE NOT FIND_IN_SET(1, sector)
  AND NOT FIND_IN_SET(2, sector)

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