Oracle SQL语法:带引号的标识符

时间:2011-06-24 13:17:13

标签: sql oracle double-quotes

我遇到了类似

的SQL查询
select "hello"
from "foo"."bar"

我发现Oracle中可以使用带引号和不带引号的标识符: Database Object Names and Qualifiers

  

...带引号的标识符以双引号(“)开头和结尾。如果使用带引号的标识符命名模式对象,则每当引用该对象时都必须使用双引号...

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

为什么?

4 个答案:

答案 0 :(得分:7)

该表名为bar而不是BAR"bar",但由于它是小写的,因此您只能使用双引号引用

select * from bar; -- will fail

select * from "bar"; -- will succeed

道德是:从不创建这样的表格!

答案 1 :(得分:3)

有助于知道在data_dictionary中,对象名称都是以大写形式存储的;除非你使用引用的标识符专门告诉oracle“嘿,我们不希望这个对象名称区分大小写”或换句话说,“用这个文字名创建这个表”

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

创建一个名为“bar”的表,只能使用“from”栏“'来选择它。这是因为'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

答案 2 :(得分: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`;

HTH

答案 3 :(得分: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”是一个标识符:在这种情况下,它代表一个表。它可以表示用户,列等,但不会被解释为字符串常量。