Как проверить, существует ли ТОЛЬКО комбинация значений в столбце? - PullRequest
0 голосов
/ 23 мая 2019

У меня есть список значений, и я хочу получить только те строки, в которых столбец имеет ТОЛЬКО комбинацию значений:

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 пропускается, потому что в ней есть Фрэнк.

Я знаю, что могу существовать, но не знаю, как проверить только эту конкретную комбинацию.

Я также не уверен, как "перебрать" все комбинации - я думал об использовании Java для выполнения 2 ^ x-1 вызовов с различными комбинациями (учитывая сценарий, очень маловероятно, что комбинация будет> 15).

Я также читал о «Выбрать все», но не уверен, поможет ли это только с определенной комбинацией.

Как я могу элегантно достичь этого?

1 Ответ

0 голосов
/ 23 мая 2019

Это версия, которая использует CTE, чтобы делать то, что вы хотите.

Я создаю таблицу @list, которая содержит предоставленные вами списки, и таблицу anoter @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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...