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
我有一个 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