我尝试做的事情可以通过以下查询(不正确)进行说明
SELECT * FROM Table1
WHERE User IN
(CASE (SELECT Username From Table2 Where Table2.ID = 1)
WHEN IS NULL THEN NULL
ELSE (SELECT Username From Table2 Where Table2.ID = 1) END)
由于User = NULL
与User IS NULL
不同,因此具有上述语法的内容将无效。有没有办法做到这一点?如果表2中有记录,我不想抓取NULLS
。
例如,
表1
ID User
1 Elias
2 NULL
表2
ID Username
1 Elias
2 NULL
我希望上面的选择返回以下记录集
ID User
1 Elias
如果我在表2中寻找ID 2,我会想要以下记录集
ID User
2 NULL
答案 0 :(得分:3)
如果您想将两个NULL
值视为匹配,则可以执行以下操作:
select t1.*
from table1 t1
where exists (select 1
from table2 t2
where t1.user = t2.username or t1.user is null and t2.user is null
);
如果您尝试匹配table2
中的值,并且table2
中没有值,则返回等于NULL
的值(我如何解释标题):
select t1.*
from table1 t1
where exists (select 1
from table2 t2
where t1.user = t2.username or t1.user is null and t2.user is null
) or
(not exists (select 1 from table2) and t1.user is null);
编辑:
为了表现,你可以这样做:
select t1.*
from table1 t1
where exists (select 1
from table2 t2
where t1.user = t2.username
) or
exists (select 1
from table2
where t1.user is null and t2.user is null
) or
(not exists (select 1 from table2) and t1.user is null);
这些可以利用table2(user)
上的索引。
答案 1 :(得分:1)
使用null作为表之间关系的链接会得到错误的行数。重复的行和东西。
我能想到的最简单的查询(为了避免这种情况)是:
select t1.*
from table1 t1
join table2 t2
on t1.user = t2.username
这将过滤掉空值。
如果你还需要在这里聚合null使用Gordon的查询,但如果你在其中一个表中有多个空值,那么你的查询是没有意义的。
答案 2 :(得分:0)
如果您想使用IN clause
SELECT * FROM Table1
WHERE User IN
(SELECT isnull(Username,'') From Table2 Where 1 = 1)