我遇到了类似
的SQL查询select "hello"
from "foo"."bar"
我发现Oracle中可以使用带引号和不带引号的标识符: Database Object Names and Qualifiers
...带引号的标识符以双引号(“)开头和结尾。如果使用带引号的标识符命名模式对象,则每当引用该对象时都必须使用双引号...
我问过DBA,他们告诉我有一个名为 bar 但没有“bar”的表
为什么?
答案 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”是一个标识符:在这种情况下,它代表一个表。它可以表示用户,列等,但不会被解释为字符串常量。