如何简化CASE语句写法?多ES/CP组合的CASE代码优化需求
简化CASE语句的几种写法
首先注意你当前的CASE语句存在语法错误:ELSE后面不能直接跟条件判断,正确语法应该是连续使用WHEN子句。以下是几种更简洁的实现方式:
方法1:拼接字段简化条件判断
将ES和CP拼接成唯一字符串,直接匹配组合值,减少重复的字段判断:
CASE WHEN CONCAT(ES, '_', CP) = 'W_S' THEN -.75 WHEN CONCAT(ES, '_', CP) = 'W_C' THEN -.06 WHEN CONCAT(ES, '_', CP) = 'W_S2' THEN -.5 WHEN CONCAT(ES, '_', CP) = 'W_P' THEN -.3 WHEN CONCAT(ES, '_', CP) = 'W_F' THEN -.1 WHEN CONCAT(ES, '_', CP) = 'S_S' THEN -.75 WHEN CONCAT(ES, '_', CP) = 'S_C' THEN -.08 WHEN CONCAT(ES, '_', CP) = 'S_S2' THEN -.8 WHEN CONCAT(ES, '_', CP) = 'S_P' THEN -.2 WHEN CONCAT(ES, '_', CP) = 'S_F' THEN -.4 END
若担心ES或CP包含下划线,可替换为|等不会冲突的分隔符。
方法2:使用映射表(更易维护)
如果后续会新增大量ES和CP组合,推荐用映射表维护对应关系,扩展性更强:
步骤1:创建映射表(临时或持久化均可)
-- 临时表示例 WITH value_map AS ( SELECT 'W' AS ES, 'S' AS CP, -.75 AS val UNION ALL SELECT 'W', 'C', -.06 UNION ALL SELECT 'W', 'S2', -.5 UNION ALL SELECT 'W', 'P', -.3 UNION ALL SELECT 'W', 'F', -.1 UNION ALL SELECT 'S', 'S', -.75 UNION ALL SELECT 'S', 'C', -.08 UNION ALL SELECT 'S', 'S2', -.8 UNION ALL SELECT 'S', 'P', -.2 UNION ALL SELECT 'S', 'F', -.4 )
步骤2:关联查询获取值
SELECT vm.val FROM your_table t LEFT JOIN value_map vm ON t.ES = vm.ES AND t.CP = vm.CP
新增组合时只需在映射表中添加行,无需修改CASE逻辑,适合组合较多的场景。
方法3:使用JSON映射(部分数据库支持)
若你的数据库支持JSON函数(如PostgreSQL、MySQL 8+),可通过JSON对象存储映射关系,写法更紧凑:
-- PostgreSQL示例 SELECT ( '{"W_S": -.75, "W_C": -.06, "W_S2": -.5, "W_P": -.3, "W_F": -.1, "S_S": -.75, "S_C": -.08, "S_S2": -.8, "S_P": -.2, "S_F": -.4}' ::jsonb ->> CONCAT(ES, '_', CP) )::numeric AS val -- MySQL示例 SELECT JSON_EXTRACT( '{"W_S": -.75, "W_C": -.06, "W_S2": -.5, "W_P": -.3, "W_F": -.1, "S_S": -.75, "S_C": -.08, "S_S2": -.8, "S_P": -.2, "S_F": -.4}', CONCAT('$.', ES, '_', CP) ) AS val
内容的提问来源于stack exchange,提问作者Glss1
相关产品推荐
相关产品推荐

