I have the following table:
+-------+ | 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 ) ....................................