如果每个y在SQL中为null,则返回x

时间:2018-08-12 13:55:52

标签: sql sql-server

我正在尝试构建SQL查询,以在条件对所有值均有效的情况下返回该值,例如:

提供此表信息:

enter image description here

在一种情况下,我需要返回每个Name,即特定名称的年龄值始终为null,在此示例中,我仅需要返回aa和cc,并非bb的所有年龄字段值都为null(其中一个是1),我该怎么办?

SELECT I.Name
FROM info I
WHERE I.Name = ALL (SELECT II.Name
                    FROM info II
                    WHERE II.Name = I.Name AND I.Age IS NULL);

我已经尝试过类似的方法,但是它不正确,因为当年龄值为null时它会返回所有值,而这并不是我想要的。感谢您的帮助。

6 个答案:

答案 0 :(得分:3)

我将使用聚合和having

select i.name
from info i
group by i.name
having count(i.age) = 0;

答案 1 :(得分:1)

GROUP BYhaving min(Age) is null一起使用

select  Name
from    info
group by Name
having  min(Age) is null

答案 2 :(得分:1)

如果您要检索其名称组都具有NULL个年龄值的整个匹配记录,则可以使用COUNT作为分析函数:

SELECT Serialnumber, Name, Age
FROM
(
    SELECT *, COUNT(Age) OVER (PARTITION BY Name) cnt
    FROM info
) t
WHERE cnt = 0;

但是,如果您只想要匹配的名称,那么我可能会选择戈登的答案。

答案 3 :(得分:0)

使用in

 select *
 from info I
  where I.Name  in (select Name
                      from  info 
                       group by  Name
                       having count(age)=0                       

                        )

http://sqlfiddle.com/#!18/78f13/2

答案 4 :(得分:0)

您可能还想尝试使用not exists

select Name from info i
where not exists(select 1 from info
                 where Name = i.Name and Age is not null)

答案 5 :(得分:0)

如果您想使用ALL,则可以利用逻辑事实,即空集的ALL元素满足任何条件:

SELECT I.Name
FROM info I
WHERE 1 = ALL (SELECT 0
               FROM info II
               WHERE II.Name = I.Name AND II.Age IS NOT NULL);