PLSQL中SELECT INTO语句避免IF条件分支的优化方案
优化后的实现方案
你可以用条件聚合写单条SELECT语句替代所有IF分支,完全满足你的变量赋值要求:
SELECT COUNT(CASE WHEN v_block = 'apple' THEN 1 END), COUNT(CASE WHEN v_block = 'mango' THEN 1 END) INTO v_apple_id, v_mango_id FROM table_fruits WHERE fruit_id = v_fruit_id;
逻辑说明
- 利用
COUNT函数不统计NULL值的特性:只有v_block匹配对应水果类型时,CASE表达式返回有效值,COUNT结果为匹配v_fruit_id的行数,不匹配的类型COUNT结果为0 - 无需硬编码任何fruit_id数值,完全复用你现有的
v_fruit_id传值逻辑 - 后续新增水果类型时,仅需在SELECT子句追加对应CASE表达式、INTO后追加对应变量即可,不用新增分支代码,扩展性极强
如果你需要非目标水果的变量保留原有值不被覆盖为0,可以用下面的写法:
SELECT NVL(MAX(CASE WHEN v_block = 'apple' THEN query_cnt END), v_apple_id), NVL(MAX(CASE WHEN v_block = 'mango' THEN query_cnt END), v_mango_id) INTO v_apple_id, v_mango_id FROM ( SELECT COUNT(*) query_cnt FROM table_fruits WHERE fruit_id = v_fruit_id );
内容的提问来源于stack exchange,提问作者Sangathamilan Ravichandran
相关产品推荐
相关产品推荐

