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

Oracle中按特定TYPE字段生成地址列的SQL语句编写求助

解决Oracle SQL的ORA-00904错误与地址聚合需求

我来帮你搞定这个SQL问题!你遇到的ORA-00904: ZIP: Invalid Identifier错误,核心原因是语法结构混乱——你把CASE表达式直接放在了地址拼接字符串的末尾,导致Oracle无法正确解析ZIP字段的位置。另外,你的需求是把同一个ID下不同TYPE的地址合并成一行,所以需要用条件聚合来实现,而不是简单的DISTINCT。

正确的SQL语句

SELECT 
    ID,
    -- 提取TYPE=1的地址作为住宅地址,无则返回NULL
    MAX(CASE WHEN TYPE = 1 THEN ADDRESS_LINE1 || ', ' || CITY || ', ' || STATE || ' ' || ZIP END) AS RESIDENTIAL_ADDRESS,
    -- 提取TYPE=3的地址作为邮寄地址,无则返回NULL
    MAX(CASE WHEN TYPE = 3 THEN ADDRESS_LINE1 || ', ' || CITY || ', ' || STATE || ' ' || ZIP END) AS MAILING_ADDRESS
FROM YOUR_TABLE_NAME -- 替换成你的实际表名
WHERE TYPE IN (1, 3) -- 直接排除TYPE=2的记录
GROUP BY ID;

关键细节解释

  • 语法修正:把CASE WHEN逻辑放在地址拼接的外层,当TYPE匹配时才生成完整的地址字符串,不匹配时返回NULL。用MAX()聚合函数是为了把同一个ID下的对应TYPE地址(即使有多条)合并成单一值;如果每个ID的TYPE1/TYPE3只有一条记录,用MIN()效果完全一样。
  • 过滤逻辑:WHERE TYPE IN (1,3)直接过滤掉TYPE=2的记录,比你原来的写法更清晰高效。
  • 空值处理:如果某个ID没有TYPE=1的记录,RESIDENTIAL_ADDRESS会自动显示NULL;同理没有TYPE=3的记录时,MAILING_ADDRESS为NULL,完美符合你要求的不同场景输出。

测试结果(基于你的样例数据)

运行上述SQL后,会得到如下结果:

IDRESIDENTIAL_ADDRESSMAILING_ADDRESS
12345abcd st, city1, CA zip1efgh st, city2, CA zip2

如果某个ID仅存在TYPE=1的记录,MAILING_ADDRESS会显示NULL;反之仅存在TYPE=3时,RESIDENTIAL_ADDRESS为NULL。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.12 05:00:05