Database Oracle SELECT-双引号还是无双引号?
全部, 在为Oracle 11i数据库编写SELECT查询时,为什么Oracle中的某些表强制对所选字段应用引号,而其他表则不这样做 我最近遇到的一个例子是: 在Aqua Data Studio的查询分析器窗口中,我尝试从两个不同的表中选择相同的字段:Database Oracle SELECT-双引号还是无双引号?,database,oracle,select,plsql,Database,Oracle,Select,Plsql,全部, 在为Oracle 11i数据库编写SELECT查询时,为什么Oracle中的某些表强制对所选字段应用引号,而其他表则不这样做 我最近遇到的一个例子是: 在Aqua Data Studio的查询分析器窗口中,我尝试从两个不同的表中选择相同的字段: select _id from table1 select _id from table2 表1和表2差别很大,但只有表1执行此select语句时没有错误。当我尝试为表2执行此语句时,我得到以下结果: ORA-00904: "_
select _id from table1
select _id from table2
表1和表2差别很大,但只有表1执行此select语句时没有错误。当我尝试为表2执行此语句时,我得到以下结果:
ORA-00904: "_ID": invalid identifier
Script line 1, statement line 1, column 7
但是,当我像这样执行第二条语句时,它工作得非常好:
select "_id" from table2
有谁知道这里发生了什么,为什么会这样,以及导致这种情况的表之间的关键区别是什么
谢谢问题来自对象的创建 如果使用小写和引号创建对象,它将强制区分大小写 因此,您需要使用引号和正确的大小写来使用它
如果创建时不使用引号(或全部使用大写),您将不会遇到任何“区分大小写”的问题,并且可以选择使用小写或大写(不带引号)的对象。有关大小写的答案和链接是正确的,但您的情况稍微超出了简单的大小写问题,这既因为列名以下划线开头,也因为客户机通常会对您隐藏引用 如果您试图创建一个包含名为
\u id
的列的表,而不引用该列,则会出现“ORA-00911:invalid character”错误,其原因文本表示“标识符不能以字母和数字以外的任何ASCII字符开头”;这实际上也是错误的,因为它也不能以数字开头(例如,0\u id
给出“ORA-00904::无效标识符”)。这一点得到以下方面的支持:
非引号标识符必须以数据库字符集中的字母字符开头。带引号的标识符可以以任意字符开头
性格
因此,Aqua DataStudio似乎遵循一种惯例,将您提供的对象名称的大写版本括在双引号中,这是一种在其中一篇链接文章中提到的做法
从您所显示的内容来看,select\u id From…
作为select“\u id”From…
”传递给Oracle,如果列名被创建为“\u id”
,则这很好。表1的情况似乎是这样的,但是表2的情况是作为“\u id”
”创建的,因此这种情况不匹配会生成您看到的合法ORA-00904
您的客户端没有修改已包含在双引号中的列名,因此,select“\u id”from…
将按原样传递给Oracle,并对table2
正常工作(但反过来,对table1
则会失败)
如果名称不符合无引号标识符的规则,并且如果名称是按引号创建的,则Oracle要求名称用双引号括起来,除非原始的引号值仍然有效,即遵循无引号规则并以大写字母输入。因为列名以下划线开头,所以对于Oracle而言,所有对它的引用都必须用双引号括起来,而不管大小写如何。如果你自己没有引用,你的客户只是在后台这样做
遵循其他人给出的建议,避免使用带引号的标识符,并始终使用有效的无引号名称,这样可以避免类似问题。请参阅我对另一个问题的回答: