0

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

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

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

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

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

我想有一种简单的方法可以做到这一点,但我现在没有看到它。

4

2 回答 2

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;
于 2013-04-01T13:21:43.733 回答
1

下面的查询只会在最终结果中输出一列。记录按列分组B并测试记录是否为。当记录为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
于 2013-04-01T13:22:43.280 回答