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

Oracle含CASE WHEN的视图查询异常:查全部正常单独查字段报错

问题原因与解决方案

根本原因

你创建视图时用双引号定义了列名 "type1" 和 "type2",Oracle中使用双引号包裹的标识符是区分大小写的。当你执行SELECT type1 FROM table2;时,Oracle会自动将type1转换为大写TYPE1,但视图实际存储的列名是小写的type1,因此会抛出"invalid identifier"错误;而SELECT *会直接匹配列的位置,不会触发大小写校验,所以能正常运行。

解决方案

方案1:查询时使用双引号匹配列名

执行查询时,给列名加上双引号,保持和视图定义中的大小写一致:

SELECT "type1" FROM "view"."table2";

方案2:修改视图,移除标识符的双引号(推荐)

Oracle默认会将未用双引号包裹的标识符转换为大写,这是更符合常规的用法。重新创建视图时去掉双引号:

CREATE VIEW view.table2 (type1, type2) AS 
SELECT
    CASE WHEN n.flag2 = 'Y' AND n.flag1 = 'Y' THEN 'n1' 
         WHEN n.flag2 = 'N' AND n.flag1 = 'Y' THEN 'n2' 
         WHEN n.flag2 = 'Y' AND n.flag1 = 'N' THEN 'n3' 
         ELSE 'n4' END AS type1,
    CASE WHEN post_code IN ('AB') THEN 'w' 
         WHEN post_code IN ('NB') THEN 'e' 
         ELSE 'o' END AS type2
FROM
    (
        SELECT
            CASE WHEN date1 > SYSDATE + 1 AND email11 IS NOT NULL THEN 'Y' ELSE 'N' END AS flag1,
            CASE WHEN date2 > SYSDATE + 12 AND email2 IS NOT NULL THEN 'Y' ELSE 'N' END AS flag2,
            post_code
        FROM table1 m
        WHERE date3 > SYSDATE
    ) n;

修改后,执行SELECT type1 FROM table2;就可以正常运行了。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.05 07:52:22