我是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;
5条答案
按热度按时间yeotifhr1#
因为您正在查找任何包含p1的内容,所以您将获得所有其他记录,因为p10包含p1。因为你的价值观被
;
,您可以检查%P1;%
或者如果p1是最后一个值,%P1
```SELECT id,name,tag FROM tbl1 WHERE tag LIKE '%P1;%' or tag like '%P1'
ltqd579y2#
你可以用
OR
用于查询行的运算符P1
:jk9hmnmh3#
首先,在rdbms中存储多个值作为分隔符分隔的字符串不是一个好的做法。你应该考虑规范化你的数据。
但是,在这种情况下,您可以利用
Find_in_set()
函数,在逗号分隔的字符串中查找子字符串。但是,您有一个分号分隔的字符串。所以,我们可以用
Replace()
函数将所有逗号替换为分号,并使用Find_in_set()
之后。请尝试以下操作:
h5qlskok4#
表的问题是在执行所引发的示例代码时出现的p11和p1。
例如“%p1%”对于两个标签都是一致的。
我会在sql语句中使用正则表达式。
对于您想要解决的情况,可以是:
p1与字符p1逐字匹配(区分大小写)
$asserts一行末尾的位置
cs7cruho5#
你喜欢的是相配的
P11
以及P12
等等,以及P1
你可以做以下几件事,先找找看;P1;
而不是P1
其次,修复边缘情况(标记位于最后的第一个)。比如: