SQL Server其中条件在具有分隔值的列上

时间:2016-08-12 08:44:18

标签: sql sql-server separator

我有一个表格,其列的值可以用","分隔。 示例列组:

id column group:

1   10,20,30
2   280
3   20

我想创建一个SELECT,其中我可以搜索列组的条件,例如20 ad它应返回1和3行或搜索20,280,它应该返回1和2行。

你能帮我吗?

2 个答案:

答案 0 :(得分:1)

简短的回答是:不要这样做。

而是将表格规范化至少3NF。如果你不知道数据库规范化是什么,你需要做一些阅读。

如果您必须这样做(例如,这是一个遗留系统,您无法更改表结构),有几篇关于使用TSQL进行字符串拆分的文章,并且至少有一些文章对各种可用方法进行了广泛的基准测试(例如,见:http://sqlperformance.com/2012/07/t-sql-queries/split-strings

由于您只想搜索,因此您不需要拆分字符串,因此您可以编写如下内容:

SELECT id, list
FROM t
WHERE ','+list+',' LIKE '%,'+@searchValue+',%'

其中t(id int, list varchar(max))是要搜索的表,@ searchValue是您要查找的值。如果需要搜索多个值,则必须在表中添加这些值并使用连接或子查询。

E.g。如果s(searchValue varchar(max))是要搜索的值表:

SELECT distinct t.id, t.list
FROM t INNER JOIN s 
       ON ','+t.list+',' LIKE '%,'+s.searchValue+',%'

如果您需要从ADO.Net传递这些搜索值,请考虑表格参数。

答案 1 :(得分:1)

正如评论中所指出的,将多个值存储在一行is not a good idea ..

提出问题,您可以使用split string functions from here之一将逗号分隔值拆分为表格,然后查询它们。

create table #temp
(
id int,
columnss varchar(100)
)

insert into #temp
values
(1,'10,20,30'),
(2,   '280'),
(3,   '20')

select * 
from #temp
cross apply
(
select * from dbo.SplitStrings_Numbers(columnss,',')
)b
where item in (20)

id  columnss    Item
1   10,20,30    20
3   20          20