Множественное сопоставление символов в предложении where - PullRequest
0 голосов
/ 28 мая 2020

У меня есть запрос SELECT со столбцом со значениями, разделенными запятыми, который также будет использоваться в предложении WHERE. Я пробовал использовать LIKE, IN, и ни один из них не работал.

Пример:

SELECT ReferenceNumber, CommaSeparatedColumn 
FROM ...    
WHERE CommaSeparatedColumn LIKE '%1,2%'

Предполагается, что SELECT возвращает значение, если CommaSeparatedColumn содержит либо 1, либо 2.

Ответы [ 2 ]

1 голос
/ 28 мая 2020

Возможным решением (с использованием LIKE) является следующий оператор:

SELECT ReferenceNumber, CommaSeparatedColumn 
FROM (VALUES
   (1, '4,3,2,8'),
   (2, '1,3,2,9'),
   (3, '5,8')
) v (ReferenceNumber, CommaSeparatedColumn)
WHERE 
   (CONCAT(',', CommaSeparatedColumn, ',') LIKE '%,1,%') OR
   (CONCAT(',', CommaSeparatedColumn, ',') LIKE '%,2,%')

Результат:

ReferenceNumber CommaSeparatedColumn
1               4,3,2,8
2               1,3,2,9

Дополнительная опция - использовать STRING_SPLIT() (для SQL Сервер 2016 +):

DECLARE @match varchar(100) = '1,2'

SELECT ReferenceNumber, CommaSeparatedColumn 
FROM (VALUES
   (1, '4,3,2,8'),
   (2, '1,3,2,9'),
   (3, '5,8')
) v (ReferenceNumber, CommaSeparatedColumn)
WHERE EXISTS (
   SELECT 1
   FROM STRING_SPLIT(v.CommaSeparatedColumn, ',') s1
   JOIN STRING_SPLIT(@match, ',') s2 ON s1.[value] = s2.[value]
)   

или

SELECT ReferenceNumber, CommaSeparatedColumn 
FROM (VALUES
   (1, '4,3,2,8'),
   (2, '1,3,2,9'),
   (3, '5,8')
) v (ReferenceNumber, CommaSeparatedColumn)
WHERE EXISTS (
   SELECT 1
   FROM STRING_SPLIT(v.CommaSeparatedColumn, ',')
   WHERE [value] IN ('1', '2')
)   
1 голос
/ 28 мая 2020

Предполагается, что SELECT возвращает значение, если CommaSeparatedColumn содержит либо 1, либо 2.

Нет, это не так. Согласно документации, он должен возвращать столбец, если CommaSeparatedColumn содержит строку, которая:

  • имеет НИЧЕГО (минимум 1 символ)
  • , за которым следует строка «1,2. "
  • , за которым следует НИЧЕГО (минимум 1 символ).

SQL не заботится о том, что вы не используете его как реляционную базу данных и не храните список в строке, это выполняет простое сопоставление строк. LIKE выполняет ТОЧНОЕ сопоставление, как указано в документации, и не заботится о том, что это либо, либо. IN то же самое, кстати, - IN ('1,2') будет соответствовать ТОЧНО.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...