【问题标题】:Where Clause That Grabs Values From A Table And If It Returns Null It Grabs Only NullsWhere 子句从表中获取值,如果返回 Null,则仅获取 Null
【发布时间】:2014-08-14 13:52:16
【问题描述】:

以下查询可以(错误地)举例说明我正在尝试做的事情

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 不同,因此上述语法将不起作用。有没有办法做到这一点?如果Table2中有记录,我不想抢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

【问题讨论】:

  • 请描述你真正想做的事情。如果你的英语不好(即使是!),样本数据和期望的结果真的很有用。
  • @GordonLinoff 我有点急于发布这个问题。我添加了专栏并(希望)添加了一个更全面的标题。

标签: sql sql-server tsql syntax null


【解决方案1】:

如果您想将两个 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) 上的索引。

【讨论】:

  • 您的第二个问题引导我朝着正确的方向前进。它唯一缺少的部分是WHERE 子句,在您编写后我将其更改为ID = 1。如果您将其纳入您的答案,我相信它会在未来对其他人有所帮助。
  • 另外,另一方面,这可能会导致小查询变得非常昂贵,非常快。虽然我不知道是否有更快的方法。
【解决方案2】:

使用 null 作为表之间关系的链接会导致错误的行数。重复的行和东西。

我能想到的最简单的查询(为了避免这种情况)是:

select t1.*
from table1 t1
join table2 t2
  on t1.user = t2.username

这将过滤掉空值。

如果您还需要在此处聚合空值,请使用 Gordon 的查询,但如果您在其中一张表中有多个空值,那么您的查询将毫无意义。

【讨论】:

    【解决方案3】:

    如果你想使用IN clause

    SELECT * FROM Table1
    WHERE User IN 
    (SELECT isnull(Username,'')  From Table2 Where 1 = 1) 
    

    【讨论】:

      猜你喜欢
      • 2021-12-04
      • 1970-01-01
      • 1970-01-01
      • 2017-10-23
      • 1970-01-01
      • 2019-04-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多