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

使用CASE WHEN排除NULL值:SQL别名报错及去重需求解决

问题解决:WHERE子句使用SELECT别名导致「无效标识符」错误

错误原因

SQL的执行顺序是先执行WHERE子句过滤数据,再执行SELECT子句生成列和别名。因此WHERE子句无法识别SELECT中定义的别名(比如你代码里的Division和CityState),这就是报错的核心原因。

解决方案

方案1:将CASE表达式直接写入WHERE子句

直接把SELECT里的CASE逻辑复制到WHERE中,替代别名:

select distinct 
    b.segment1 as "Project Code", 
    b.NAME,
    (case when a.CLASS_CATEGORY = 'Division' then a.CLASS_CODE end) as "Division",
    (case when a.CLASS_CATEGORY = 'City State' then a.CLASS_CODE end) as "CityState"
from PROD.PROJECT_CLASSES a
inner join prod.projects_all b
    on a.project_id = b.project_id
where 
    (case when a.CLASS_CATEGORY = 'Division' then a.CLASS_CODE end) is not null
    and (case when a.CLASS_CATEGORY = 'City State' then a.CLASS_CODE end) is not null
order by b.segment1

方案2:使用CTE(公共表表达式)提升可读性

先通过CTE生成包含别名的临时结果集,再在外层查询中过滤NULL值,代码更易维护:

with project_data as (
    select distinct 
        b.segment1 as "Project Code", 
        b.NAME,
        (case when a.CLASS_CATEGORY = 'Division' then a.CLASS_CODE end) as "Division",
        (case when a.CLASS_CATEGORY = 'City State' then a.CLASS_CODE end) as "CityState"
    from PROD.PROJECT_CLASSES a
    inner join prod.projects_all b
        on a.project_id = b.project_id
)
select *
from project_data
where "Division" is not null
    and "CityState" is not null
order by "Project Code"

两种方案都能实现你的需求:保留原有列结构、剔除含NULL值的行、去除重复行。

内容的提问来源于stack exchange,提问作者user23415231

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.29 18:37:16