I have the following table:
x
+-------+
| Token |
+=======+
| A |
+-------+
| B |
+-------+
| B |
+-------+
| C |
+-------+
| A |
+-------+
| X |
+-------+
and I want to check ALL values of the column ‘Token’ and return a flag string to designate what condition is met:
- when all records are in group (A, B) –> return
'Condition1'
,examples:
AABAAB: true
AAAAAA: false
BBBBBB: false
AABBAC: false
- when all records are in group (A, B, C) –> return
'Condition2'
examples:
AABBAC: true
AABAAB: false
AAAAAA: false
BBBBBB: false
AXBBAC: false
so I am basically looking for a general SELECT statement that looks like:
select case when exists ( select .
from test_table
where .) -- the SQL Statement that checks if Condition1 is met
then 'Condition1'
when exists ( select .
from test_table
where .) -- the SQL Statement that checks if Condition1 is met
then 'Condition1'
else 'NOTHING'
end condition_met
from dual;
or any other form of SQL that provide the desired results.
Advertisement
Answer
You can use LISTAGG()
aggregate function to get all the distinct values of Token
as a comma separated list and check the result in a CASE
expression:
WITH cte AS (
SELECT LISTAGG(Token, ',') WITHIN GROUP (ORDER BY Token) Tokens
FROM (SELECT DISTINCT Token FROM tablename) t
)
SELECT CASE Tokens
WHEN 'A,B' THEN 'Condition1'
WHEN 'A,B,C' THEN 'Condition2'
ELSE 'Nothing'
END condition_met
FROM cte
See the demo.
Note that in recent versions of Oracle you can include DISTINCT
inside LISTAGG()
:
WITH cte AS (
SELECT LISTAGG(DISTINCT Token, ',') WITHIN GROUP (ORDER BY Token) Tokens
FROM tablename
)