如何在Netezza的CASE WHEN中使用临时变量避免重复表达式?
在Netezza中简化CASE WHEN避免重复表达式的方法
你尝试的写法不可行,问题出在两点:
's' = A+B+C会生成布尔值(真/假),和后续WHEN 0的数值类型不匹配,逻辑完全不对- 字符串
s和数值类型的A+B+C做比较会触发类型兼容错误
在Netezza里没法直接在SELECT语句里定义类似局部变量的东西,但可以通过以下几种方式实现「一次计算、多次引用」的效果:
方法1:子查询提前计算
先在子查询里算出A+B+C的结果并起别名,外层直接引用这个别名写CASE逻辑:
SELECT CASE calc_val WHEN 0 THEN 1 ELSE calc_val END AS result FROM ( SELECT A+B+C AS calc_val FROM X ) sub_query
方法2:CTE(公共表表达式)
和子查询逻辑类似,用WITH子句先定义计算结果,可读性更好,适合复杂查询:
WITH calc_result AS ( SELECT A+B+C AS calc_val FROM X ) SELECT CASE calc_val WHEN 0 THEN 1 ELSE calc_val END AS result FROM calc_result
方法3:LATERAL JOIN
通过LATERAL JOIN来定义临时计算列,适合需要和原表其他字段关联的场景:
SELECT CASE calc.calc_val WHEN 0 THEN 1 ELSE calc.calc_val END AS result FROM X LATERAL (SELECT A+B+C AS calc_val) calc
额外简化:针对你的特定逻辑
你的CASE逻辑是「当计算值为0时返回1,否则返回自身」,还可以用COALESCE+NULLIF进一步简化(前提是A+B+C不会为NULL,或者NULL的处理和原逻辑一致):
SELECT COALESCE(NULLIF(A+B+C, 0), 1) AS result FROM X
这个写法里NULLIF(A+B+C, 0)会在值为0时返回NULL,否则返回原值,再用COALESCE把NULL替换成1,和原CASE逻辑完全一致,而且不需要额外的子查询。
内容的提问来源于stack exchange,提问作者Renzo
相关产品推荐
相关产品推荐

