通过将逗号分隔列表与逗号分隔列表进行匹配来过滤行

时间:2019-02-14 18:13:09

标签: sql sql-server sql-server-2012

我有下表

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 :(得分:2)

您可以简单地使用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, ',%')
)

答案 1 :(得分:2)

您可以对like使用concat(',', col2, ',')运算符:

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

所以',ACA,ABS,PHR,' like '%,ABS,%'返回true

答案 2 :(得分:0)

在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 + ',%'

Demo on db<>fiddle

答案 3 :(得分:-1)

尝试这样的事情。

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