Sql 通过将逗号分隔列表与逗号分隔列表相匹配来筛选行

Sql 通过将逗号分隔列表与逗号分隔列表相匹配来筛选行,sql,sql-server,sql-server-2012,sql-like,Sql,Sql Server,Sql Server 2012,Sql Like,我有下表 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

我有下表

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中有一个代码匹配,我就可以得到该行,这样我就可以直接传入带分隔符的列表,只要找到一个匹配项,就可以检索该行


谢谢

您可以简单地使用LIKE运算符,如下所示:

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

如果您希望接受逗号分隔的值作为搜索输入,则可以使用STRING_SPLIT()(自SQL Server 2016起提供):


试试这样的

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

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


因此,
,ACA,ABS,PHR,'像“%”,ABS,%%
返回
true

另一个很好的例子说明了为什么数据应该以三阶形式保存。表1中的每一列都应该有一个值。如果无法修复表,那么接受用户定义的表作为参数如何?然后可以将UDT连接到Col2上的表,如UDT.col+'%'。最后一个路由是将字符串拆分成一个表,然后进行连接。这不是一个坏主意。我可以这样做。对不起,我应该在我的问题中提到。就像我知道的那样,这会起作用,但我很好奇如何使用分隔参数directly@user1221989:好的,让我细化我的答案,然后在sql server中添加了
STRING\u SPLIT
2016@forpas:对。。。我没有注意sqlserver-2012标记。我刚刚更新了我的答案,提到2016年。这仍然会给出“ABS”或“MCM”的超集结果。为什么不使用一个过程,该过程采用逗号分隔的字符串并匹配每个字符串,然后使用循环和/或并集返回所有匹配的结果。
SELECT *
FROM myTable
WHERE Col2 LIKE '%ABS%'
OR Col2 LIKE '%MCM%'
select * from tablename
where 
  concat(',', col2, ',') like '%,ABS,%'
  or
  concat(',', col2, ',') like '%,MCM,%'