SQL(TSQL)-在另一列不为空的列中选择值?
我将保持这个简单-我想知道是否有一个好方法来选择一列中的所有值,当它在另一列中从来没有空值时。比如说SQL(TSQL)-在另一列不为空的列中选择值?,sql,sql-server,tsql,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子句等。但这已经是一个非常独特集合的一部分,我希望保持这一效率 我应该注意到,就我的目的而言,这只是一
A B
----- -----
1 7
2 7
NULL 7
4 9
1 9
2 9
从上面的集合中,我只想从B中得到9,而不是7,因为7在a中有一个NULL。显然,我可以将其包装为子查询并使用in子句等。但这已经是一个非常独特集合的一部分,我希望保持这一效率
我应该注意到,就我的目的而言,这只是一个单向比较。。。我将只返回B中的值并检查A
我想有一种简单的方法可以做到这一点,但我现在还不知道,因为我身在一大堆事情中。你可以这样做:
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;
下面的查询将在最终结果中只输出一列。记录按列
B
分组,并测试记录是否为空。当记录为空时,组的值将每次递增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
第二个例子对我来说非常有效!我应该注意到,所有这些都是避免关系分裂的一部分。