PostgreSQL中如何为CASE语句添加不等于0的WHERE过滤条件?
报错原因
SQL执行顺序中,WHERE子句的执行优先级高于SELECT子句,你在SELECT中定义的别名Actual_Value在执行WHERE过滤时还未生成,因此会提示列不存在。
解决方案
方案1:直接在WHERE中复用CASE表达式
把CASE逻辑原封不动放到WHERE条件中即可,适合逻辑简单的场景:
SELECT *, CASE WHEN A.TestValue IS NULL THEN B.Collected WHEN B.Collected IS NULL THEN A.TestValue END AS Actual_Value FROM test_Table WHERE (CASE WHEN A.TestValue IS NULL THEN B.Collected WHEN B.Collected IS NULL THEN A.TestValue END) <> 0;
方案2:使用子查询封装计算结果
先在子查询里计算出Actual_Value,外层查询再做过滤:
SELECT * FROM ( SELECT *, CASE WHEN A.TestValue IS NULL THEN B.Collected WHEN B.Collected IS NULL THEN A.TestValue END AS Actual_Value FROM test_Table ) t WHERE Actual_Value <> 0;
方案3:使用CTE(公共表表达式)封装
逻辑和子查询一致,可读性更强,适合多层复杂计算的场景:
WITH calc_table AS ( SELECT *, CASE WHEN A.TestValue IS NULL THEN B.Collected WHEN B.Collected IS NULL THEN A.TestValue END AS Actual_Value FROM test_Table ) SELECT * FROM calc_table WHERE Actual_Value <> 0;
内容的提问来源于stack exchange,提问作者Sriram
相关产品推荐
相关产品推荐

