2013-04-01 66 views
0

我会保持这种简单 - 我想知道是否有一种很好的方法来选择列中的所有值,而不会在另一列中出现空值。例如。SQL(TSQL) - 在另一列不为空的列中选择值?

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

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

从上面的设置我只想从9 B和没有7,因为7具有A的NULL很显然,我可以换这是一个子查询和使用IN子句等但这已经是一部分一个非常独特的设置,并希望保持这种高效。

我要指出,我的目的,这将只是一个单向的比较......我只会在返回B值和审查A.

我想有一个简单的方法来做到这一点,我很想念,但是现在我没有看到它。

回答

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; 
+0

第二个例子非常适合我的目的!我应该指出,所有这些都是避免关系分工的一部分。 –

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 

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

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 
相关问题