Oracle 11g中CREATE AS SELECT建表后查询别名列报ORA-00904错误求助
问题原因与解决方案
这事儿我太熟了——你遇到的是Oracle标识符大小写敏感性的典型问题!
核心原因
在Oracle中,当你用双引号包裹列别名(比如"Mycolum_C")创建表时,Oracle会严格保留别名的大小写格式。而默认情况下,如果你查询时不用双引号(比如SELECT Mycolum_C FROM B),Oracle会自动把你输入的标识符转换成大写去匹配数据库里的列名,这时候数据库里实际存储的列名是大小写混合的Mycolum_C,但Oracle去找的是全大写的MYCOLUM_C,自然就找不到对应列,报出ORA-00904错误。
至于SELECT * FROM B能正常返回,是因为*会直接读取表的所有列元数据,不需要你手动指定列名,也就不会触发大小写不匹配的问题。
解决办法
有两种实用方式可以解决这个问题:
查询时用双引号包裹列名
保持和创建表时完全一致的大小写格式,并用双引号括起来,比如:SELECT "Mycolum_C", "Mycolum_D" FROM B;这样Oracle就会精确匹配你创建时定义的列名。
重新创建表时去掉双引号
如果不想每次查询都额外写双引号,建议创建表时去掉列别名的双引号,Oracle会自动将列名转换成大写存储,后续查询不管你输入的是大小写混合还是全小写(只要拼写正确),都能正常匹配:CREATE TABLE B AS SELECT code, name, useday AS Mycolum_C, validperiod AS Mycolum_D, enddate FROM A;这时候表B的列名实际存储为
MYCOLUM_C和MYCOLUM_D,你用SELECT Mycolum_C FROM B或者SELECT mycolum_c FROM B都能正常返回结果。
补充小提示
Oracle的标识符规则可以简单记:
- 不带双引号的标识符:自动转大写,查询时不区分大小写。
- 带双引号的标识符:严格保留大小写,查询时必须用双引号且大小写完全匹配。
内容的提问来源于stack exchange,提问作者JRG
相关产品推荐
相关产品推荐

