如何在PL/SQL函数的SELECT语句中使用多个CASE语句?
实现包含双CASE语句的状态计算函数
针对你的需求——处理用户分多行存储的状态(A、B或两者皆有),且不能使用LISTAGG,我整理了一个完整的Oracle函数实现,用两个CASE语句分别捕获A和B的存在状态,再组合结果:
CREATE OR REPLACE Function F_Calc_State(p_code Varchar2, p_id Number, p_time varchar2) Return Varchar2 AS l_result Varchar2(10) := null; l_A Varchar2(10) := null; l_B Varchar2(10) := null; BEGIN -- 用两个CASE语句分别查询用户是否拥有状态A和B SELECT CASE WHEN EXISTS ( SELECT 1 FROM your_user_state_table -- 替换成你的实际表名 WHERE user_id = p_id AND state = 'A' AND code = p_code -- 应用传入的code过滤条件 AND time_col = p_time -- 替换成你的时间列名 ) THEN 'A' END, CASE WHEN EXISTS ( SELECT 1 FROM your_user_state_table WHERE user_id = p_id AND state = 'B' AND code = p_code AND time_col = p_time ) THEN 'B' END INTO l_A, l_B FROM dual; -- 组合最终状态结果 IF l_A IS NOT NULL AND l_B IS NOT NULL THEN l_result := l_A || ',' || l_B; ELSIF l_A IS NOT NULL THEN l_result := l_A; ELSIF l_B IS NOT NULL THEN l_result := l_B; END IF; RETURN l_result; END F_Calc_State; /
关键说明:
- 修正了你原代码里的变量声明问题(原
Calc_State(10) := null;是错误写法,改成了l_result作为最终返回变量) - 用
EXISTS子查询配合CASE语句,分别判断当前用户是否存在状态A和B,完美避开多行数据的干扰 - 最后通过简单的条件判断组合结果:
- 同时拥有A和B → 返回
A,B - 仅拥有A → 返回
A - 仅拥有B → 返回
B - 都没有 → 返回
null
- 同时拥有A和B → 返回
测试你的示例数据:
假设表中有你给出的示例数据:
| User | State |
|---|---|
| 1 | A |
| 1 | B |
| 2 | A |
| 3 | B |
调用F_Calc_State('xxx', 1, 'yyy')会返回A,B,调用F_Calc_State('xxx', 2, 'yyy')返回A,调用F_Calc_State('xxx', 3, 'yyy')返回B,完全符合预期。
内容的提问来源于stack exchange,提问作者M.Doe
相关产品推荐
相关产品推荐

