SQL(TSQL) - 在另一列不为空的列中选择值?

时间:2013-04-01 13:20:31

标签: sql sql-server tsql

我会保持这个简单 - 我想知道是否有一个好方法可以选择列中的所有值,因为它在另一列中永远不会为空。例如。

  A      B
-----  -----

  1      7
  2      7
NULL     7
  4      9
  1      9
  2      9

从上面的集合中我只想要B中的9而不是7,因为7在A中有一个NULL。显然我可以将它包装为子查询并使用IN子句等但这已经是一个非常独特的集合的一部分我希望保持这种效率。

我应该注意,就我的目的而言,这只是一种单向比较......我只会在B中返回值并检查A.

我想有一种简单的方法可以做到这一点,我很想忘记,但是在我现在看不到的事情中。

2 个答案:

答案 0 :(得分:1)

您可以这样做:

select *
from t
where t.b not in (select b from t where a is null);

如果您只想要不同的b值,那么您可以这样做:

select b
from t
group by b
having sum(case when a is null then 1 else 0 end) = 0;

最后,你可以使用窗口函数:

select a, b
from (select t.*,
             sum(case when a is null then 1 else 0 end) over (partition by b) as NullCnt
      from t
     ) t
where NullCnt = 0;

答案 1 :(得分:1)

下面的查询只会在最终结果中输出一列。记录按列B分组,并测试记录是否为 null 。当记录为 null 时,组的值每次都会递增1. HAVING子句仅过滤值为0的组。

SELECT  B
FROM    TableName
GROUP   BY B
HAVING  SUM(CASE WHEN A IS NULL THEN 1 ELSE 0 END) = 0

如果要从记录中获取所有行,可以使用join。

SELECT  a.*
FROM    TableName a
        INNER JOIN
        (
            SELECT  B
            FROM    TableName
            GROUP   BY B
            HAVING  SUM(CASE WHEN A IS NULL THEN 1 ELSE 0 END) = 0
        ) b ON  a.b = b.b