我有下表
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中有一个代码匹配,我就可以得到该行,这样我就可以直接传递带分隔符的列表,并且只要找到一个匹配的行即可检索到。
谢谢
答案 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 + ',%'
答案 3 :(得分:-1)
尝试这样的事情。
SELECT *
FROM myTable
WHERE Col2 LIKE '%ABS%'
OR Col2 LIKE '%MCM%'