我遇到的 SQL 查询看起来像
select "hello"
from "foo"."bar"
我发现我们可以在 Oracle 中使用带引号和不带引号的标识符: 数据库对象名称和限定符
... 带引号的标识符以双引号 (") 开头和结尾。如果您使用带引号的标识符命名架构对象,则在引用该对象时必须使用双引号...
我问了 DBA,他们告诉我有一个名为bar但没有“bar”的表
这是为什么?
我遇到的 SQL 查询看起来像
select "hello"
from "foo"."bar"
我发现我们可以在 Oracle 中使用带引号和不带引号的标识符: 数据库对象名称和限定符
... 带引号的标识符以双引号 (") 开头和结尾。如果您使用带引号的标识符命名架构对象,则在引用该对象时必须使用双引号...
我问了 DBA,他们告诉我有一个名为bar但没有“bar”的表
这是为什么?
该表已命名bar
,但由于它是小写的BAR
,"bar"
因此您只能使用双引号来引用它:
select * from bar; -- will fail
select * from "bar"; -- will succeed
道德是:永远不要创建这样的表格!
知道在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
通过引用某些内容,它会强制对数据库实体进行非整理匹配。所以我认为托尼的回答几乎是正确的:
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`;
高温高压
在另一个类似的注释中,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.