我想比较两组值,看看是否有交集。第一组值在运行时指定,第二组值存储在数据库的一行中。
下面是一些示例代码:
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 表中创建它,而不是在语句中创建它,但逻辑JOIN和EXISTS逻辑是相同的。
同样,我们可以使用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测试。
给定三个设置输入和一个单独的值表,以下代码将起作用。
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)