我有一个包含逗号分隔值的表格,如
id locs
1 a,s,d,f
2 s,d,f,a
3 d,s,a,f
4 d,f,g,a
5 a,s,e
6 f,d
当我使用逗号分隔的id为1的字符串时,我需要在sql server中输出1,2,3,6。
这意味着我已经使用了id为1的loc并用逗号分隔,现在我想要所有包含id 1的分隔值的id。
注意:我知道我不必在表中保留逗号分隔值,但它发生了。
希望我对我的问题很清楚。
答案 0 :(得分:0)
如果我理解正确,您需要从所选行的locs列返回至少包含一个逗号分隔值的所有行的id值。由于这是一个糟糕的数据库设计,因此这个问题只能是一个丑陋的解决方案。 首先创建一个用户定义的函数,将逗号分隔值拆分为一个表。有很多方法可以做到,this is the first that google found。
DECLARE @Values varchar(max)
SELECT @Values = Locs
FROM Table WHERE Id = @Id
SELECT Id
FROM Table INNER JOIN dbo.Split(@Values) SplitedString
ON( '%,'+ SplitedString.s+',%' LIKE ',' + Locs + ',')
答案 1 :(得分:0)
declare @tb table (id int, locs varchar(50))
insert into @tb values(1, 'a,s,d,f'),
(2,'s,d,f,a'),
(3,'d,s,a,f'),
(4,'d,f,g,a'),
(5,'a,s,e'),
(6,'f,d')
declare @cta varchar(20)='s,d,f,a'
;with cte0(id,col2)
as
(
select id,t.c.value('.','varchar(max)') as col2 from (select id,x= cast('<t>'+replace(locs,',','</t><t>') +'</t>' as xml) from @tb) a cross apply x.nodes('/t') t(c)
)
select distinct id from cte0 where @cta like '%'+col2+'%' and id not in( select distinct id from cte0 where @cta not like '%'+col2+'%')