Mysql Select Like query - PullRequest
       10

Mysql Select Like query

0 голосов
/ 28 октября 2018

Я новичок в 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, который должен быть только этим двумя.это возможно?

 id          Name           Tag
 7861        Add1           P6;P4;P5;P2;P3;P1
 5567        Tun            P12;P10;P8;P9;P1;P6;

Ответы [ 5 ]

0 голосов
/ 28 октября 2018

Проблема с вашей таблицей связана с вхождениями P11 и P1 при выполнении образца кода, который вы вызываете.

LIKE '% P1%' согласован для обеих меток.

Iбудет использовать регулярное выражение в операторе SQL.

Для случая, который вы хотите решить, будет:

WHERE column1 regexp 'P1$';
  • P1 буквально соответствует символам P1 (с учетом регистра)
  • $ устанавливает позицию в конце строки
0 голосов
/ 28 октября 2018

Ваш лайк соответствует P11 и P12 и т. Д., А также P1

Вы можете сделать следующие вещи, сначала ищите ;P1; вместо P1

Во-вторых, исправить крайние случаи (где тег является первым последним).что-то вроде:

SELECT id,name,tag FROM tbl1 WHERE concat(';',tag,';') LIKE '%;P1;%'
0 голосов
/ 28 октября 2018

Вы можете использовать оператор OR для запроса строк с P1:

SELECT id,name,tag FROM tbl1 WHERE (tag LIKE '%P1;%' or tag LIKE '%P1');
0 голосов
/ 28 октября 2018

Поскольку вы ищете все, что содержит P1, вы получаете все остальные записи, поскольку P10 содержит P1.Поскольку ваши значения разделены ;, вы можете проверить что угодно, например %P1;% или, если P1 - последнее значение, %P1

SELECT id,name,tag FROM tbl1 WHERE tag LIKE '%P1;%' or tag like '%P1'
0 голосов
/ 28 октября 2018
  • Во-первых, не рекомендуется хранить несколько значений в виде разделенных разделителями строк в СУБД.Вам следует рассмотреть нормализацию ваших данных.
  • Однако в этом случае вы можете использовать функцию Find_in_set(), чтобы искать подстроку в строке через запятую,
  • Но вместо этого у вас есть разделенная точкой с запятой строка.Таким образом, мы можем использовать функцию Replace(), чтобы заменить все запятые точкой с запятой, и затем использовать Find_in_set().

Попробуйте вместо этого следующее:

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