我正在尝试构建SQL查询,以在条件对所有值均有效的情况下返回该值,例如:
提供此表信息:
在一种情况下,我需要返回每个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时它会返回所有值,而这并不是我想要的。感谢您的帮助。
答案 0 :(得分:3)
我将使用聚合和having
:
select i.name
from info i
group by i.name
having count(i.age) = 0;
答案 1 :(得分:1)
将GROUP BY
与having 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
)
答案 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);