如何检查一列中是否仅存在值的组合?

时间:2019-05-23 01:43:50

标签: sql sql-server database

我有一个值列表,我只想获取该列只有值组合的行:

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)。

我还阅读了有关“全选”的信息,但不确定是否也只能使用独特的组合。

我该如何优雅地实现这一目标?

1 个答案:

答案 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