我有一个值列表,我只想获取该列只有值组合的行:
Ex:
>CREATE TABLE User_Group(
[id] [int] NOT NULL,
[names] [varchar](255) NOT NULL,
) ON [PRIMARY]
Sample content User_Group:
1:" Joe,Jane"
2:"Jane, James,Frank"
3: "Jane, Joe,James"
我正在通过名称列表传递,我想检查User_group表中是否存在名称组合并返回行。我只希望包含精确组合的行。
例如,如果给我詹姆斯,简和乔的信息,我想检查2 ^ 3-1次表中是否存在詹姆斯,简,乔,詹姆斯和简,詹姆斯和乔,简和乔,詹姆斯和简和乔。从这种情况下,我应该只获得第1行和第3行。由于第2行具有Frank,因此将跳过第2行。
我知道我确实可以存在,但不确定如何仅检查该特定组合。
我也不确定如何在所有组合中“循环”-我考虑过要使用Java进行具有不同组合的2 ^ x-1调用(鉴于这种情况,组合不太可能大于15)。
我还阅读了有关“全选”的信息,但不确定是否也只能使用独特的组合。
我该如何优雅地实现这一目标?
答案 0 :(得分:0)
这是一个使用CTE完成您想要的事情的版本。
我创建一个表@list,其中包含您提供的列表,并注释表@search,其中包含每个搜索词。
declare @list table(k int, l varchar(100))
insert @list values (1,' Joe,Jane')
,(2,'Jane, James,Frank')
,(3,'Jane, Joe,James')
declare @search table(sk int,s varchar(20))
insert @search values (1,'jane'),(2,'joe'),(3,'james')
-- Top level CTE to remove spaces, and each term is surrounded by its own commas.
;with cte as (
select k,','+replace(replace(l,',',',,'),' ','')+',' l from @list
)
-- Go through the search terms recursively and remove the search terms, with their surrounding commas
,cte2 as(
select cte.k, replace(cte.l,','+s+',','') as l, s.sk, s.s
from cte
join @search s on sk=1
union all
select cte2.k, replace(cte2.l,','+s.s+',','') as l, s.sk ,s.s
from cte2
join @search s on s.sk=cte2.sk+1
)
-- Find any that result in zero length
select distinct k from cte2 where len(l)=0