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

Oracle SQL语法:带引号的标识符,sql,oracle,double-quotes,Sql,Oracle,Double Quotes,我遇到的SQL查询看起来像 select "hello" from "foo"."bar" 我发现我们可以在Oracle中使用带引号和不带引号的标识符: 。。。带引号的标识符以双引号开始和结束。如果使用带引号的标识符命名架构对象,则无论何时引用该对象,都必须使用双引号 我问了DBA,他们告诉我有一个表名为bar,但没有bar 为什么会这样?该表名为bar,而不是bar或bar,但因为它是小写的,所以只能使用双引号引用: select * from bar; -- will fail sel

我遇到的SQL查询看起来像

select "hello"
from "foo"."bar"
我发现我们可以在Oracle中使用带引号和不带引号的标识符:

。。。带引号的标识符以双引号开始和结束。如果使用带引号的标识符命名架构对象,则无论何时引用该对象,都必须使用双引号

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

为什么会这样?

该表名为bar,而不是bar或bar,但因为它是小写的,所以只能使用双引号引用:

select * from bar; -- will fail

select * from "bar"; -- will succeed

寓意是:永远不要创建这样的表格

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

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

知道在数据字典中,对象名称都以大写形式存储有帮助;除非您使用带引号的标识符专门告诉oracle hey,否则我们不希望此对象名称区分大小写,或者换句话说,使用此文本名称创建此表

下面-创建一个名为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

另一个类似的注意事项是,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是一个标识符:在本例中,它表示一个表。它可以表示用户、列等,但不会被解释为字符串常量。

双引号标识符是SQL-92标准!如果您希望确保不依赖数据库魔术转换字符,请始终使用带引号的标识符。@使用双引号的标识符作为组织标准会使处理数据库变得更加烦人,尤其是当您需要直接在数据库中查找时。最好的组织标准是,只使用不必引用的标识符,然后在代码中引用它们。如果我使用了需要引号的标识符,我宁愿我的数据库升级脚本在我面前爆炸。@jpmc26另外,SQL 92标准不要求使用双引号标识符,它允许使用双引号标识符-与Oracle中完全一样!因为某些事情是允许的并不意味着它是可取的。@ceving你是认真的吗?您希望在数据库中有不同的表,称为PERSON、PERSON和PERSON?很快就会明白,在甲骨文中,你坚持使用以字母开头的名字,之后除了字母、数字和下划线之外什么都没有,这也是允许的,但不鼓励使用。我想这需要各种各样的东西…@ceving虽然我不能不查一下就告诉你所有的东西,但我可以肯定地告诉你,如果你不看前面的注释,而坚持使用Oracle中的大写字母、数字和下划线,你是安全的!。在PG中,小写字母、数字和下划线。KISS哲学。对SQL-92违规者表示敬意值得吗?@ceving这不是违规,SQL 92允许引用和非引用标识符。@TonyAndrews是的,但它不允许反勾号作为引号。@ceving同意,我不知道你指的是那个。但如果foo.bar存在并且有一个名为hello的列,它不会给出错误。我很确定这就是OP所期望的:hello列的值。