如果所有值都为null,则SQL选择具有相同键的列

时间:2012-02-07 14:32:53

标签: sql sql-server-2005

我有两列,ColumnA和ColumnB,偶尔columnB不会填充,它应该是e。我正在寻找一个只会选择所有ColumnA是否未填充的查询。

ColumnA|ColumnB
Apples|
Apples|
Apples|Orange

这就是我的意思,但这是不正确的,因为它表示ColumnA为null,具有相同的值并且填充了ColumnB。我希望查询只返回所有columnB未填充的行。

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

3 个答案:

答案 0 :(得分:3)

您当前的查询会给您太多结果。您要消除的是 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)仅计算非空表达式值

答案 1 :(得分:2)

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

  • 您的查询在A列中找到值,其中 是B列中的NULL值。
  • 我认为你想要A列中的值,其中不是 列中的非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)

答案 2 :(得分:0)

使用EXCEPT。这可以表示为

  

获取A列,除了该列A中的某些非空值

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?