принцип работы оператора IN в sql - PullRequest
0 голосов
/ 11 июня 2018

У меня есть столбец varchar типа «a, b, c, d, cd, cx, bx».Здесь есть запятая для разделения некоторого префиксного кода, и я хочу найти префикс c в этом столбце.Имя столбца - префикс.

Когда мы используем оператор IN:

select * from prefixes where 'c' IN (prefix)

, он работает, но как?Я знаю, что префикс должен 'a', 'b', 'c', 'd', 'cd', 'cx', 'bx' для работы с оператором IN, например:

select * from prefixes where 'c' IN ('a', 'b', 'c', 'd', 'cd', 'cx', 'bx')

Янеправильно?И как это может работать?Запятые не являются разделителями.Они в строке, как префикс.

Ответы [ 2 ]

0 голосов
/ 12 июня 2018

То же, что и ниже, запрос работает

SELECT *
FROM some_table
WHERE 'a' = 'a'

ИЛИ другие примеры: 1 = 1, 1 <5, 'a' IN ('abc').Все это будет работать. </p>

Запрос будет проходить через все записи в таблице, и когда он проверяет условие (ГДЕ), оно всегда истинно.Он вернет все данные в вашей таблице, потому что у вас есть статическое условие, которое всегда верно.

0 голосов
/ 11 июня 2018

Вот общий запрос, который будет работать:

SELECT *
FROM yourTable
WHERE ',' || col || ',' LIKE '%,c,%';

Хитрость здесь заключается в поиске ,c, в слегка измененном значении столбца ,a,b,c,d,cd,cx,bx,.Мы добавляем запятые в начало и конец значения CSV столбца, чтобы каждый термин можно было однозначно адресовать с помощью разделителей запятых.

Хотя это дает вам обходной путь, вы должны рассматривать его как временный.Лучшее долгосрочное решение - не хранить CSV в ваших таблицах.

...