5

我遇到的 SQL 查询看起来像

select "hello"
from "foo"."bar"

我发现我们可以在 Oracle 中使用带引号和不带引号的标识符: 数据库对象名称和限定符

... 带引号的标识符以双引号 (") 开头和结尾。如果您使用带引号的标识符命名架构对象,则在引用该对象时必须使用双引号...

我问了 DBA,他们告诉我有一个名为bar但没有“bar”的表

这是为什么?

4

4 回答 4

9

该表已命名bar,但由于它是小写的BAR"bar"因此您只能使用双引号来引用它:

select * from bar; -- will fail

select * from "bar"; -- will succeed

道德是:永远不要创建这样的表格!

于 2011-06-24T13:26:58.357 回答
3

知道在data_dictionary中,对象名都是大写的;除非您使用带引号的标识符专门告诉 oracle“嘿,我们不希望此对象名称区分大小写”,或者换句话说,“使用此文字名称创建此表”

下面 - 创建一个名为 bar 的表,您可以使用 'from bar'、'from BaR'、'from BAR' 进行选择。'from "bar"' 不起作用,因为您对 oracle 说“给我从字面上命名为小写 "bar" 的表中的结果。

创建一个名为“bar”的表,您只能使用“from”bar”从中进行选择。这是因为“from bar”转换为“from BAR”。

SQL> create table bar (x varchar2(1));

Table created.

SQL> 
SQL> select * from bar;

no rows selected

SQL> select * from BAR;

no rows selected

SQL> select * from "bar";
select * from "bar"
              *
ERROR at line 1:
ORA-00942: table or view does not exist 


SQL> select * from "BAR";

no rows selected

SQL> 
SQL> drop table bar;

Table dropped.

SQL> 
SQL> create table "bar" (x varchar2(1));

Table created.

SQL> 
SQL> select * from bar;
select * from bar
              *
ERROR at line 1:
ORA-00942: table or view does not exist 


SQL> select * from BAR;
select * from BAR
              *
ERROR at line 1:
ORA-00942: table or view does not exist 


SQL> select * from "bar";

no rows selected

SQL> select * from "BAR";
select * from "BAR"
              *
ERROR at line 1:
ORA-00942: table or view does not exist 


SQL> 
SQL> drop table "bar";

Table dropped.

SQL> spool off
于 2011-06-24T14:28:37.983 回答
2

通过引用某些内容,它会强制对数据库实体进行非整理匹配。所以我认为托尼的回答几乎是正确的:

select sysdate from dual; -- works

select sysdate from DUAL; -- works

select sysdate from "DUAL"; -- works

select sysdate from "dual"; - FAILS

正如您所引用的,如果表是使用带引号的字符串创建的,那么您可能必须使用带引号的字符串来引用它。

我没有尝试过 Oracle,但在其他 DBMS 上,使用带引号的标识符允许您使用保留字作为标识符,例如在 MySQL(它使用反引号而不是兔子耳朵)中,以下是有效的:

SELECT `SUM` FROM `WHERE`;

高温高压

于 2011-06-24T14:18:36.577 回答
2

在另一个类似的注释中,Oracle 中的双引号表示一个标识符,而不是您引用的文本所表示的字符串常量。这意味着即使 "foo"."bar" 存在,您的示例也会给您一个错误。考虑这个简单的例子:

SQL> SELECT "hello" FROM "DUAL";

SELECT "hello" FROM "DUAL"

ORA-00904: "hello": invalid identifier

与此相比:

SQL> SELECT 'hello' FROM "DUAL";

'HELLO'
-------
hello

"DUAL" is an identifier: in this case it represents a table. It can represent a user, a column, etc., but it won't be interpreted as a string constant.

于 2011-06-24T14:29:22.803 回答