我使用PostgreSQL 11.4,并且想解决以下问题:
让我说一下下表:
foo | bar
---------
a null
a 2
a 8
a 3
b 2
c null
c 8
c 5
c 2
我想获取foo中的所有字段,其中bar作为至少一个null和一个none-null值。
所以预期的结果将是a
和c
,因为这些是唯一具有至少一个null和一个非null值的键
请注意,我这里没有唯一的主键,因此我不能真正基于foo对表进行几次连接并检查每个连接或其他内容。
有人知道如何解决此问题吗?
任何信息将不胜感激。
答案 0 :(得分:1)
一种解决方案是使用两个EXISTS条件:
select distinct foo
from the_table t1
where exists (select *
from the_table t2
where t2.bar is null
and t2.foo = t1.foo)
and exists (select *
from the_table t3
where t3.bar is not null
and t3.foo = t1.foo)
另一种选择是按foo分组并计算行数:
select foo
from the_table
group by foo
having count(*) filter (where bar is null) > 0
and count(*) filter (where bar is not null) > 0;
第一个可能会更快
答案 1 :(得分:0)
您可以使用with子句,选择所有具有空值的foo,然后选择所有具有非空值的foo ...
with temp_null as
(
select distinct on (foo)
*
from public.tbl_test2
where bar is null
),
temp_notnull as
(
select distinct on (foo)
*
from public.tbl_test2
where bar is not null
)
select distinct on (foo)
foo
from public.tbl_test2
where foo in (select foo from temp_null)
and foo in (select foo from temp_notnull)
答案 2 :(得分:0)
没有主键不应影响您的加入能力。以下内容似乎可以满足您的要求:
create table foobar (foo VARCHAR (50),bar int);
insert into foobar (foo,bar)
values('a',null),
('a',2),
('a',8),
('a',3),
('b',2),
('c',null),
('c',8),
('c',5),
('c',2);
select a.foo from foobar a
JOIN foobar b
on b.foo = a.foo
where a.bar is null
and b.bar is not null
group by a.foo;