【问题标题】:SQL select column with same key if all values are null如果所有值都为空,则 SQL 选择具有相同键的列
【发布时间】:2012-02-28 23:43:10
【问题描述】:

我有两列,ColumnA 和 ColumnB,偶尔 columnB 没有被填充,它应该是 e。我正在寻找一个仅在所有 ColumnA 都未填充时才会选择的查询。

ColumnA|ColumnB
Apples|
Apples|
Apples|Orange

这就是我的意思,但这是不正确的,因为它说 ColumnA 为空且具有相同的值,而 ColumnB 已填充。如果所有 columnB 均未填充,我希望查询仅返回行。

SELECT ColumnA
 FROM tblMyTable
WHERE ColumnA IN
      (SELECT ColumnA 
         FROM tblMyTableB
        WHERE ColumnB IS NULL)

【问题讨论】:

    标签: sql sql-server-2005


    【解决方案1】:

    使用 EXCEPT。这可以表示为

    获取 A 列,除了 A 列的 B 列中有一些非空值

    DECLARE @MyTable TABLE (ColumnA varchar(20) NOT NULL, ColumnB varchar(20) NULL);
    
    INSERT @MyTable VALUES
      ('Apple', NULL),('Apple', NULL),('Apple', 'Orange'),
      ('Banana', NULL),('Banana', NULL), 
      ('Strawberry', 'Pie'), ('Strawberry', 'Pie')
    
    SELECT ColumnA FROM @MyTable
    EXCEPT
    SELECT ColumnA FROM @MyTable WHERE ColumnB IS NOT NULL
    

    更多关于除了:Why does EXCEPT exist in T-SQL?

    【讨论】:

      【解决方案2】:

      您当前的查询为您提供了太多结果。您要消除的是那些 ColumnB 值的那些:

      SELECT ColumnA
       FROM tblMyTable
      WHERE ColumnA IN
            (SELECT ColumnA 
               FROM tblMyTableB
              WHERE ColumnB IS NULL)
      AND NOT ColumnA IN
            (SELECT ColumnA 
               FROM tblMyTableB
              WHERE ColumnB IS NOT NULL)
      

      或者,更聪明的是:

      select ColumnA,COUNT(ColumnB) from tblMyTable
      group by ColumnA having COUNT(ColumnB) = 0
      

      因为COUNT(Expression) 只计算非空表达式值

      【讨论】:

      • @MarkBannister - 是的,首先更多的是“快速而肮脏,应该工作”。我试了几次才把第二个写对了(对不起,我在你写你的时候发布了)
      【解决方案3】:

      看起来你的逻辑是倒退的:

      • 您的查询在 A 列中找到值,而在 B 列中存在一个 NULL 值。
      • 我认为您希望 A 列中的值没有 B 列中的 非 NULL 值。

      尝试在两个地方添加NOT 并添加DISTINCT 以避免得到重复的结果:

      SELECT DISTINCT ColumnA
      FROM tblMyTable
      WHERE ColumnA NOT IN
            (SELECT ColumnA 
             FROM tblMyTableB
             WHERE ColumnB IS NOT NULL)
      

      此外,如果 ColumnA 可以为 NULL,那么您必须从内部查询中排除这些 NULL 值,否则 NOT IN 表达式将返回 NULL 而不是 True,因此不会返回任何结果:

      SELECT DISTINCT ColumnA
      FROM tblMyTable
      WHERE ColumnA NOT IN
            (SELECT ColumnA 
             FROM tblMyTableB
             WHERE ColumnA IS NOT NULL
             AND ColumnB IS NOT NULL)
      

      【讨论】:

      • 否,因为我只想找到 ColumnA 中所有值的 columnB 为空的实例
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2023-02-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-12-23
      • 2017-06-04
      • 1970-01-01
      相关资源
      最近更新 更多