You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.04 16:51:01