Mysql Select 赞查询

Mysql Select Like query

我是 SQL 的初学者。我想显示所有具有 'P1' 的行,但我的查询没有给我我想要的输出我有 table 命名为 '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 的人,应该只有这两个。可能吗?

 id          Name           Tag
 7861        Add1           P6;P4;P5;P2;P3;P1
 5567        Tun            P12;P10;P8;P9;P1;P6;
  • 首先,在 RDBMS 中将多个值存储为分隔符分隔的字符串并不是一个好习惯。您应该考虑 normalizing 您的数据。
  • 但是,在这种情况下,您可以利用 Find_in_set() 函数在逗号分隔的字符串中查找子字符串。
  • 但是,您有一个以分号分隔的字符串。所以,我们可以使用Replace()函数将所有逗号替换为分号,然后使用Find_in_set()

改为尝试以下操作:

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

您可以使用 OR 运算符来查询具有 P1 的行:

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

因为您要查找包含 P1 的所有内容,所以您将获得所有其他记录,因为 P10 包含 P1。由于您的值由 ; 分隔,您可以检查任何类似 %P1;% 的内容,或者如果 P1 是最后一个值,%P1

SELECT id,name,tag FROM tbl1 WHERE tag LIKE '%P1;%' or tag like '%P1'

你的赞匹配 P11P12 等以及 P1

你可以做以下事情,首先寻找;P1;而不是P1

其次,修复边缘情况(标签是倒数第一个)。类似于:

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

在执行您提出的示例代码时,您的 table 出现了 P11 和 P1 的问题。

两个标签的 LIKE '%P1%' 是一致的。

我会在 SQL 语句中使用正则表达式。

对于您要解决的案例是:

WHERE column1 regexp 'P1$';
  • P1 按字面匹配字符 P1(区分大小写)
  • $ 断言行尾的位置