I have the following simple table
COL1 | COL2 | COL3 |
---|---|---|
U1 | L1 | X |
U1 | L5 | X |
U2 | L2 | X |
U3 | L2 | X |
U4 | L4 | X |
U4 | L6 | X |
U5 | L7 | X |
when I execute the statement
x
select COL1
from table t
where t.COL3= 'X'
and t.COL2 in ('L1', 'L2', 'L3', 'L4');
Result:
U1
U2
U3
U4
My desired result is
U2
U3
The U1 and U4 should be filtered out because one of their COL2 contains an element which is not in the list.
Is it possible to achieve it in a SQL statement?
I appreciate any help!
Advertisement
Answer
A full example of how to achieve what you want using a simple aggregate function:
create table test (col1 text, col2 text, col3 text);
insert into test values ('U1', 'L1', 'X');
insert into test values ('U1', 'L5', 'X');
insert into test values ('U2', 'L2', 'X');
insert into test values ('U3', 'L2', 'X');
insert into test values ('U4', 'L4', 'X');
insert into test values ('U4', 'L6', 'X');
insert into test values ('U5', 'L7', 'X');
select
col1
from (
select
col1,
-- aggregate all occurences for each value in col1 and see if any is missing, if so this will be false
bool_and(col2 in ('L1', 'L2', 'L3', 'L4')) as has_value
from test
where col3 = 'X'
group by col1
) agg
where has_value;