首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Oracle SELECT -双引号还是不带双引号?

Oracle SELECT -双引号还是不带双引号?
EN

Stack Overflow用户
提问于 2013-07-04 21:45:54
回答 2查看 8.5K关注 0票数 2

全,

在为Oracle 11i数据库编写SELECT查询时,为什么Oracle中的某些表强制对所选字段使用引号,而其他表则不这样做。

我最近遇到的一个例子:

在Aqua Data Studio的Query Analyzer窗口中,我尝试从两个不同的表中选择相同的字段:

代码语言:javascript
复制
    select _id from table1
    select _id from table2

table1和table2有很大的不同,但是只有table1执行这个select语句时没有错误。当我尝试为table2执行这条语句时,我得到了以下结果:

代码语言:javascript
复制
ORA-00904: "_ID": invalid identifier
Script line 1, statement line 1, column 7 

但是,当我像这样执行第二条语句时,它可以完美地工作:

代码语言:javascript
复制
    select "_id" from table2

有没有人知道这里发生了什么,为什么会这样,表之间的关键差异是什么?

谢谢

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-07-04 23:16:47

关于大小写的答案和链接是正确的,但您的情况超出了简单的大小写问题,这既是因为您的列名以下划线开头,也是因为您的客户显然通常对您隐藏了引用。

如果您尝试创建一个包含名为_id的列的表,但没有将其引起来,则会得到一个'ORA-00911: invalid character‘错误,其原因文本显示’标识符不能以字母和数字以外的任何ASCII码字符开头‘;这实际上也是错误的,因为它也不能以数字开头(例如,0_id给出了'ORA-00904::invalid identifier')。这是由database object naming rules备份的

非引号标识符必须以数据库字符集中的字母字符开头。带引号的标识符可以以任何字符开头。

因此,看起来Aqua Data Studio遵循了一种惯例,即用双引号将您提供的对象名称的大写版本括起来,这一做法在其中一个链接的帖子中提到。

如您所示,select _id from ...将作为select "_ID" from ...传递给Oracle,如果列名被创建为"_ID",这是可以接受的。看起来这就是table1的情况,但是table2是作为"_id"创建的-所以大小写不匹配会生成您看到的合法ORA-00904。

您的客户机不会修改已经包含在双引号中的列名,因此select "_id" from ...会按原样传递到Oracle,并且可以在table2上正常工作(但反过来,在table1上就会失败)。

如果名称不遵循未加引号的标识符的规则,并且它是用引号创建的,Oracle要求名称用双引号括起来-除非原始的引号值无论如何都是有效的,即遵循未加引号的规则并以大写输入。由于您的列名以下划线开头,因此对于Oracle而言,无论大小写如何,对它的所有引用都必须用双引号括起来。如果你自己没有引用的话,你的客户只是在幕后这么做。

遵循其他人的建议,避免使用带引号的标识符,并始终使用有效的未带引号的名称,可以避免类似的问题。

票数 4
EN

Stack Overflow用户

发布于 2013-07-04 21:49:23

问题来自于对象的创建。

如果您创建了一个带有小写和引号的对象,它将强制区分大小写。

所以你需要使用引号和大小写来使用它。

如果创建时不带引号(或全部大写),则不会遇到任何“区分大小写”的问题,并且可以选择小写或大写的对象(不带引号)

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/17471948

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档