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
相关产品推荐
相关产品推荐

