mysql select-like查询

mw3dktmi  于 2021-06-18  发布在  Mysql
关注(0)|答案(5)|浏览(345)

我是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;
yeotifhr

yeotifhr1#

因为您正在查找任何包含p1的内容,所以您将获得所有其他记录,因为p10包含p1。因为你的价值观被 ; ,您可以检查 %P1;% 或者如果p1是最后一个值, %P1 ```
SELECT id,name,tag FROM tbl1 WHERE tag LIKE '%P1;%' or tag like '%P1'

ltqd579y

ltqd579y2#

你可以用 OR 用于查询行的运算符 P1 :

SELECT id,name,tag FROM tbl1 WHERE (tag LIKE '%P1;%' or tag LIKE '%P1');
jk9hmnmh

jk9hmnmh3#

首先,在rdbms中存储多个值作为分隔符分隔的字符串不是一个好的做法。你应该考虑规范化你的数据。
但是,在这种情况下,您可以利用 Find_in_set() 函数,在逗号分隔的字符串中查找子字符串。
但是,您有一个分号分隔的字符串。所以,我们可以用 Replace() 函数将所有逗号替换为分号,并使用 Find_in_set() 之后。
请尝试以下操作:

SELECT id,name,tag 
FROM tbl1 
WHERE FIND_IN_SET(REPLACE(tag, ';', ','), 'P1') > 0
h5qlskok

h5qlskok4#

表的问题是在执行所引发的示例代码时出现的p11和p1。
例如“%p1%”对于两个标签都是一致的。
我会在sql语句中使用正则表达式。
对于您想要解决的情况,可以是:

WHERE column1 regexp 'P1$';

p1与字符p1逐字匹配(区分大小写)
$asserts一行末尾的位置

cs7cruho

cs7cruho5#

你喜欢的是相配的 P11 以及 P12 等等,以及 P1 你可以做以下几件事,先找找看 ;P1; 而不是 P1 其次,修复边缘情况(标记位于最后的第一个)。比如:

SELECT id,name,tag FROM tbl1 WHERE concat(';',tag,';') LIKE '%;P1;%'

相关问题