类似于比较两个集合的“in”的运算符

Jas*_*son 7 sql-server

我想比较两组值,看看是否有交集。第一组值在运行时指定,第二组值存储在数据库的一行中。

下面是一些示例代码:

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
Run Code Online (Sandbox Code Playgroud)

感觉代码太繁琐了,不知道有没有什么简单的方法可以搞定。谢谢!

Bra*_*adC 10

您可以只JOIN对真实或动态派生的表:

DECLARE @var1 INT=2;
DECLARE @var2 INT=15;
DECLARE @var3 INT=-7;

IF EXISTS (SELECT 1 FROM 
             (VALUES (1),(2),(3))tableNums(number)
             INNER JOIN (VALUES (@var1), (@var2), (@var3))tableVars(var)
             ON tableNums.number=tableVars.var
       )
    SELECT 1    --or do something else interesting
ELSE SELECT 0   --or do the opposite
Run Code Online (Sandbox Code Playgroud)

如果列表很长,我可能会提前在#temp 表中创建它,而不是在语句中创建它,但逻辑JOINEXISTS逻辑是相同的。


同样,我们可以使用INTERSECT代替JOIN

CASE WHEN EXISTS ( SELECT * FROM (VALUES (1), (2), (3)) AS x(i) 
                 INTERSECT 
                   SELECT * FROM (VALUES (@var1), (@var2), (@var3)) AS y(i)
                 )
THEN 1 ELSE 0 END 
Run Code Online (Sandbox Code Playgroud)

dbfiddle.uk测试。


Ant*_*ese 1

给定三个设置输入和一个单独的值表,以下代码将起作用。

declare @input1 int =1
declare @input2 int =2
declare @input3 int =3

CREATE TABLE #tab1 (var1 INT, var2 INT , var3 INT)
INSERT INTO #tab1 
VALUES (1,2,3),(0,0,0),(0,4,0),(1,4,1),(4,0,0),(0,5,1),(2,4,0),(1,4,3)


 declare @set table(input int)
 insert  @set values (@input1), (@input2),(@input3);

 select distinct #tab1.*, case when join1.i1 is null then 'No Match' else 'match' end matching
 from #tab1
 left join (select distinct a.input i1, b.input i2 ,c.input i3
                from @set a 
                cross join @set b 
                cross join @set c ) join1
    on join1.i1=#tab1.var1
        or join1.i2=#tab1.var2
        or join1.i3=#tab1.var3
Run Code Online (Sandbox Code Playgroud)

我认为如果您不想使用“in”,这就是您所寻找的。老实说,我会用“in”。它更简单,更容易编写。上面的代码需要一些时间才能工作。但是,我会按如下方式更新您的“in”代码:

select * ,'match'
from #tab1
where @input1 in (var1, var2, var3)
    or @input2 in (var1, var2, var3)
    or @input3 in (var1, var2, var3)
union 
select * ,'no-match'
from #tab1
where @input1 not in (var1, var2, var3)
    and @input2 not in (var1, var2, var3)
    and @input3 not in (var1, var2, var3)
Run Code Online (Sandbox Code Playgroud)