假设我有一个包含2列的表:
Col1 Col2
a x
a y
a z
b x
c y
我想选择在col2中具有特定值的col1值(例如"仅' x'","仅' y&#39 ;"或"仅' x'和' y'")。
例如,如果我想选择没有col2值' z'的col1值,结果应为:
Col1
b
c
答案 0 :(得分:1)
使用漂亮的@a_horse_with_no_name provided sample和方便的bool_*
aggregate functions。 Code Wall
不是z
select c1
from t
group by c1
having not bool_or(c2 = 'z')
;
c1
----
c
b
e
d
仅x
select c1
from t
group by c1
having bool_and(c2 = 'x')
;
c1
----
b
d
必须有x
和y
,而不是其他
select c1
from t
group by c1
having bool_or(c2 = 'x') and bool_or(c2 = 'y') and bool_and (c2 in ('x','y'))
;
c1
----
e
至少x
和y
select c1
from t
group by c1
having bool_or(c2 = 'x') and bool_or(c2 = 'y')
;
c1
----
a
e
答案 1 :(得分:0)
我想选择没有col2值的col1值' z'
select distinct t1.col1
from the_table t1
where not exists (select *
from the_table t2
where t1.col1 = t2.col1
and t2.col2 = 'z');
然而,,例如"只有' x'"
有点不同:
select col1
from the_table
group by col1
having count(distinct col2) = 1
and min(col2) = 'x'
and max(col2) = 'x'
"只有x"也可以使用Postgres布尔聚合函数来完成:
select col1
from the_table
group by col1
having bool_and(col2 = 'x');
"只有' x'和''
这可以读作" *至少x和y" (但也允许其他值)。然后这将是:
select col1
from the_table t1
group by col1
having array_agg(col2 order by col2) @> array['x','y'];
使用标准SQL,上面的内容将是这样的:
select col1
from the_table
where col2 in ('x','y')
group by col1
having count(distinct col2) = 2;
如果" 仅' x'和' "意味着完全那两个,然后可以使用=
比较数组而不是使用" contains"操作
select col1
from the_table t1
group by col1
having array_agg(col2 order by col2) = array['x','y'];
order by
的{{1}}非常重要,因为array_agg()
是一个不同的数组,然后{'y','x'}
这也可以使用布尔聚合来表示:
{'x','y'}
使用标准SQL这个"正是那两个"变得有点复杂:
select col1
from the_table
group by col1
having bool_and(col2 in ('x','y'))
and count(distinct col2) = 2;