从表中获取值的条款,如果它返回空,它只获取空值

时间:2014-08-14 13:52:16

标签: sql sql-server tsql syntax null

我尝试做的事情可以通过以下查询(不正确)进行说明

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 = NULLUser 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

3 个答案:

答案 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)