Quero comparar dois conjuntos de valores e ver se há interseções. O primeiro conjunto de valores é especificado em tempo de execução e o segundo conjunto de valores é armazenado em uma linha de um banco de dados.
Aqui estão alguns códigos de exemplo:
CREATE TABLE #tab1 (var1 INT, var2 INT , var3 INT)
INSERT INTO #tab1
VALUES (1,2,3),(0,0,0),(0,4,0)
Select
a = (case when 1 IN (var1,var2,var3) OR
2 IN (var1,var2,var3) OR
3 IN (var1,var2,var3)
THEN 1 else 0 end)
from #tab1
Eu sinto que o código é muito complicado e estou querendo saber se há alguma maneira simples de fazê-lo. Obrigado!
Você pode apenas
JOIN
para tabelas reais ou derivadas dinamicamente:Se a lista fosse muito longa, eu provavelmente a criaria em uma tabela #temp antecipadamente em vez de fazê-lo na instrução, mas a lógica
JOIN
eEXISTS
seria a mesma.Da mesma forma, poderíamos usar
INTERSECT
em vez deJOIN
:Teste em dbfiddle.uk .
Você pode tentar o seguinte em vez de CASE
Se você não precisar manter as variáveis, poderá escrever um loop como,
... mas isso não é tabley. Somos DBAs e usamos tabelas.
Dadas três entradas de configuração e uma tabela separada de valores, o código a seguir funcionará.
Eu acho que isso é o que você estava procurando se não quisesse usar 'in'. Para ser honesto, eu usaria 'in'. É muito mais simples e fácil de escrever. O código acima levou algum tempo para funcionar. No entanto, eu atualizaria seu código 'in' da seguinte maneira: