我有一个表格,其列的值可以用","分隔。 示例列组:
id column group:
1 10,20,30
2 280
3 20
我想创建一个SELECT,其中我可以搜索列组的条件,例如20 ad它应返回1和3行或搜索20,280,它应该返回1和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