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'
你的赞匹配 P11
和 P12
等以及 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(区分大小写)
- $ 断言行尾的位置
我是 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'
你的赞匹配 P11
和 P12
等以及 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(区分大小写)
- $ 断言行尾的位置