SQL 服务器 where 条件列的分隔值

SQL Server where condition on column with separated values

我有一个 table,其列中的值可以用“,”分隔。 示例列组:

id column group:

1   10,20,30
2   280
3   20

我想在列组上创建一个带有 where 条件的 SELECT,我可以在其中搜索例如 20 广告 它应该 return 1 和 3 行或搜索 20,280 它应该 return 1 和 2 行。

你能帮帮我吗?

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

而是将您的 table 标准化为至少 3NF。如果你不知道什么是数据库规范化,你需要做一些阅读。

如果你绝对必须这样做(例如,这是一个遗留系统,你不能更改 table 结构),有几篇关于使用 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)) 是要搜索的 table,@searchValue 是您要查找的值。如果您需要搜索多个值,则必须将这些值添加到 table 中并使用连接或子查询。

例如如果 s(searchValue varchar(max)) 是要搜索的 table 个值,则:

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

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

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

针对您的问题,您可以使用 split string functions from here 之一将逗号分隔值拆分为 table,然后查询它们..

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