我是SQL的初学者。我想显示所有具有“ P1”的行,但是我的查询没有给出我想要的输出,我有一个名为“ tbl1”的表
tbl1
id Name Tag
8756 ADD P2;P3;P10;P11;P12;P15
7861 Add1 P6;P4;P5;P2;P3;P1
7823 Place P11;P12;P10;P8;P9;P6;P7;P4;P5;P2;P3
5567 Tun P12;P10;P8;P9;P1;P6;
6789 lac P3;
我的查询就是这样
SELECT id,name,tag FROM tbl1 WHERE tag LIKE '%P1%'
但是我的输出是这样
id Name Tag
8756 ADD P2;P3;P10;P11;P12;P15
7861 Add1 P6;P4;P5;P2;P3;P1
7823 Place P11;P12;P10;P8;P9;P6;P7;P4;P5;P2;P3
5567 Tun P12;P10;P8;P9;P1;P6;
我想要的输出仅是那些拥有p1的人,而p1只能是这两个。有可能吗?
id Name Tag
7861 Add1 P6;P4;P5;P2;P3;P1
5567 Tun P12;P10;P8;P9;P1;P6;
答案 0 :(得分:1)
Find_in_set()
函数在逗号分隔的字符串中查找子字符串。 Replace()
函数将所有逗号替换为分号,然后再使用Find_in_set()
。请尝试以下操作:
SELECT id,name,tag
FROM tbl1
WHERE FIND_IN_SET(REPLACE(tag, ';', ','), 'P1') > 0
答案 1 :(得分:1)
由于您要查找包含P1的任何内容,因此您将获得所有其他记录,因为P10包含P1。当您的值用;
分隔时,您可以检查类似%P1;%
的值,或者检查P1是否是最后一个值%P1
SELECT id,name,tag FROM tbl1 WHERE tag LIKE '%P1;%' or tag like '%P1'
答案 2 :(得分:1)
在执行您提出的示例代码时,表的问题会出现P11和P1。
两个标签的“%P1%”相似。
我会在SQL语句中使用正则表达式。
对于您要解决的情况,将是:
WHERE column1 regexp 'P1$';
答案 3 :(得分:0)
您可以使用OR
运算符使用P1
查询行:
SELECT id,name,tag FROM tbl1 WHERE (tag LIKE '%P1;%' or tag LIKE '%P1');
答案 4 :(得分:0)
您的喜欢与P11
和P12
等以及P1
匹配
您可以执行以下操作,首先寻找;P1;
而不是P1
其次,修复边缘情况(标记在最后)。像这样:
SELECT id,name,tag FROM tbl1 WHERE concat(';',tag,';') LIKE '%;P1;%'