如何解决检查列中的所有值是否属于特定组
我有下表:
+-------+
| Token |
+=======+
| A |
+-------+
| B |
+-------+
| B |
+-------+
| C |
+-------+
| A |
+-------+
| X |
+-------+
并且我想检查“令牌”列的所有值并返回一个标志字符串以指定满足什么条件:
- 当所有记录都在(A,B)组中时-->返回
'Condition1'
,-
示例:
AABAAB: true AAAAAA: false BBBBBB: false AABBAC: false
-
- 当所有记录都在(A,B,C)组中时-->返回
'Condition2'
-
示例:
AABBAC: true AABAAB: false AAAAAA: false BBBBBB: false AXBBAC: false
-
所以我基本上是在寻找一个通用的 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。
解决方法
您可以使用 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 中,您可以在 DISTINCT
中包含 LISTAGG()
:
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
,
尝试计算 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
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。