检查列中的所有值是否属于特定组
Check if all values in a column falls into a specific group
我有以下 table:
+-------+
| Token |
+=======+
| A |
+-------+
| B |
+-------+
| B |
+-------+
| C |
+-------+
| A |
+-------+
| X |
+-------+
我想检查列 'Token' 的所有值和 return 标志字符串以指定满足什么条件:
- 当所有记录都在组(A,B)时 --> return
'Condition1'
,
示例:
AABAAB: true
AAAAAA: false
BBBBBB: false
AABBAC: false
- 当所有记录都在组 (A, B, C) 时 --> return
'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。
试着数一数 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
我有以下 table:
+-------+
| Token |
+=======+
| A |
+-------+
| B |
+-------+
| B |
+-------+
| C |
+-------+
| A |
+-------+
| X |
+-------+
我想检查列 'Token' 的所有值和 return 标志字符串以指定满足什么条件:
- 当所有记录都在组(A,B)时 --> return
'Condition1'
,示例:
AABAAB: true AAAAAA: false BBBBBB: false AABBAC: false
- 当所有记录都在组 (A, B, C) 时 --> return
'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。
试着数一数 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