Фильтрация строк путем сопоставления списка через запятую со списком через запятую - PullRequest
0 голосов
/ 14 февраля 2019

У меня есть таблица ниже

Col1       Col2
1          ACA,ABS,PHR
2          PHR
3          MCM
4          ABC

Теперь я хочу отфильтровать данные из этого, поэтому, если у меня есть параметр фильтра, как, скажем, 'ABS,MCM' Я хочу получить только те строки, которые имеют хотя бы одинсоответствующий код.Поэтому в этом случае я должен получить отфильтрованный результат как

Col1       Col2
1          ACA,ABS,PHR
2          MCM

Теперь я могу использовать запрос Select * from myTable where Col2 in ('ABS','MCM'), но тогда он не будет получать первую строку ACA,ABS,PHR.Может кто-нибудь, пожалуйста, скажите мне, как я могу выполнить текстовый поиск кодов, если только один код совпадает с Col2, я получаю строку, чтобы я мог передать непосредственно список с разделителями и до тех пор, пока он находит одно совпадение, строканайдено.

Спасибо

Ответы [ 4 ]

0 голосов
/ 14 февраля 2019

В SQL 2012 вы можете использовать функции XML для разделения строки (при условии, что значения, разделенные запятыми, не содержат никаких специальных символов):

DECLARE @t TABLE (col1 INT, col2 VARCHAR(100));
INSERT INTO @t VALUES
(1, 'ACA,ABS,PHR'),
(2, 'PHR'),
(3, 'MCM'),
(4, 'ABC');
DECLARE @str AS VARCHAR(100) = 'ABS,MCM';

WITH cte1 AS (
    SELECT col1, col2, node.value('.', 'varchar(10)') AS val
    FROM @t
    CROSS APPLY (SELECT CAST('<x>' + REPLACE(col2, ',', '</x>,<x>') + '</x>' AS XML)) AS x(doc)
    CROSS APPLY doc.nodes('/x') AS n(node)
)
SELECT *
FROM cte1
WHERE ',' + @str + ',' LIKE '%,' + val + ',%'

Демонстрация на db <> fiddle

0 голосов
/ 14 февраля 2019

Попробуйте что-то вроде этого.

SELECT *
FROM myTable
WHERE Col2 LIKE '%ABS%'
OR Col2 LIKE '%MCM%'
0 голосов
/ 14 февраля 2019

Вы можете использовать like оператор для concat(',', col2, ','):

select * from tablename
where 
  concat(',', col2, ',') like '%,ABS,%'
  or
  concat(',', col2, ',') like '%,MCM,%'

Так что ',ACA,ABS,PHR,' like '%,ABS,%' возвращает true

0 голосов
/ 14 февраля 2019

Вы можете просто использовать оператор LIKE следующим образом:

SELECT *
FROM mytable
WHERE Col2 LIKE '%ABS%' OR Col2 LIKE '%MCM%'

Если вы хотите принять значение для поиска через запятую в качестве входных данных для поиска, вы можете использовать STRING_SPLIT () (доступно с SQL Server 2016):

SELECT *
FROM mytable t
WHERE EXISTS (
    SELECT 1
    FROM (SELECT val FROM STRING_SPLIT('ABS, MCM', ',')) x
    WHERE CONCAT(',', t.Col1, ',')
        LIKE CONCAT('%,', x.val, ',%')
)
...