检查列中的所有值是否属于特定组

Check if all values in a column falls into a specific group

我有以下 table:

+-------+
| Token |
+=======+
| A     |
+-------+
| B     |
+-------+
| B     |
+-------+
| C     |
+-------+
| A     |
+-------+
| X     |
+-------+

我想检查列 'Token' 的所有值和 return 标志字符串以指定满足什么条件:

所以我基本上是在寻找一个通用的 SELECT 语句,如下所示:

      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;

或提供所需结果的任何其他形式的 SQL。

试着数一数 A、B 和 C 的数量:

SELECT CASE WHEN Total = A + B -- Optional: AND A > 0 AND B > 0
            THEN 'Condition1'
            WHEN Total = A + B + C -- Optional: AND A > 0 AND B > 0 AND C > 0
            THEN 'Condition2'
            ELSE 'NOTHING'
       END AS Result
  FROM ( SELECT SUM(CASE Token WHEN 'A' THEN 1 ELSE 0 END) AS A
              , SUM(CASE Token WHEN 'B' THEN 1 ELSE 0 END) AS B
              , SUM(CASE Token WHEN 'C' THEN 1 ELSE 0 END) AS C
              , COUNT(*) AS Total
           FROM test_table ) X

您可以使用 LISTAGG() 聚合函数获取 Token 的所有不同值作为逗号分隔列表,并在 CASE 表达式中检查结果:

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

参见demo

请注意,在最新版本的 Oracle 中,您可以在 LISTAGG():

中包含 DISTINCT
WITH cte AS (
  SELECT LISTAGG(DISTINCT Token, ',') WITHIN GROUP (ORDER BY Token) Tokens
  FROM tablename
)
....................................

我只想使用 case 表达式:

select (case when sum(case when token = 'A' then 1 else 0 end) > 0 and
                  sum(case when token = 'B' then 1 else 0 end) > 0 and
                  sum(case when token = 'C' then 1 else 0 end) > 0 and
                  sum(case when token not in ('A', 'B', 'C') then 1 else 0 end) = 0
             then 'Condition ABC'
             when sum(case when token = 'A' then 1 else 0 end) > 0 and
                  sum(case when token = 'B' then 2 else 0 end) > 0 and
                  sum(case when token not in ('A', 'B') then 1 else 0 end) = 0
             then 'Condition AB'
        end)
from test_table