database - Oracle SELECT - 双引号还是没有双引号?

标签 database oracle select plsql

<分区>

全部,

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

我最近遇到的一个例子:

在 Aqua Data Studio 的查询分析器窗口中,我试图从两个不同的表中选择相同的字段:

    select _id from table1
    select _id from table2

table1和table2差别很大,但是只有table1执行这条select语句没有报错。当我尝试对 table2 执行此语句时,我得到以下信息:

ORA-00904: "_ID": invalid identifier
Script line 1, statement line 1, column 7 

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

    select "_id" from table2

有谁知道这里发生了什么,为什么会这样,以及导致这种情况的表之间的关键差异是什么?

谢谢

最佳答案

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

如果您尝试创建一个包含名为 _id 的列的表,但没有引用它,那么您会收到“ORA-00911:无效字符”错误,其原因文本为“标识符不得以字母和数字以外的任何 ASCII 字符开头;这实际上也是错误的,因为它也不能以数字开头(例如,0_id 给出 'ORA-00904: : invalid identifier')。这由 database object naming rules 支持:

Nonquoted identifiers must begin with an alphabetic character from your database character set. Quoted identifiers can begin with any character.

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

根据您所显示的内容,select _id from ... 被传递给 Oracle 作为 select "_ID"from ...,如果列名称创建为 "_ID"table1 似乎是这种情况,但 table2 是作为 "_id" 创建的 - 因此大小写不匹配会生成合法的 ORA-00904看见了。

您的客户端未修改已包含在双引号中的列名,因此 select "_id"from ... 按原样传递给 Oracle,并且适用于 table2(但相反,对于 table1 会失败)。

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

按照其他人给出的建议避免使用带引号的标识符并始终使用有效的不带引号的名称可以避免此类问题。

关于database - Oracle SELECT - 双引号还是没有双引号?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17471948/

相关文章:

sql - 存储多种数据类型

sql - 如何从按不同项目分组的结果集中计算最大(列)行

mysql - sql 两张表的组合和distinct只有特定的值

mysql - INSERT INTO SELECT 不起作用

php - 为什么我在使用 w3school 教程时遇到错误?

python - 具有三层深度嵌套模型的查询集过滤器(多个一对多关系)

sql - Oracle SQL - 将主键添加到表

sql - 具有动态参数的Oracle Lag函数

asp.net - TNS :listener does not currently know of service requested in connect descriptor

php - 为什么这种使用 PDO 计算 Mysql 行数的方法不起作用?