为什么这个简单的 select 语句需要引号?

Kar*_*lth 1 oracle

为什么下面的说法

select * from expertrule where rule_id = '1';
Run Code Online (Sandbox Code Playgroud)

返回此错误

ORA-00904: "RULE_ID": invalid identifier
Run Code Online (Sandbox Code Playgroud)

尽管

select * from expertrule where "rule_id" = '1';
Run Code Online (Sandbox Code Playgroud)

作品!

表格的每一列(只有这个表格)也是如此。此特定表中的所有列都需要将其名称括起来。为什么?

  CREATE TABLE "TEST"."expertrule" 
   (    "rule_id" NUMBER(*,0), 
    "name" VARCHAR2(256 BYTE), 
    "description" VARCHAR2(256 BYTE), 
    "ruleaccess" VARCHAR2(4000 BYTE), 
    "ruledisable" VARCHAR2(4000 BYTE), 
    "userssn" VARCHAR2(256 BYTE), 
    "departmentid" VARCHAR2(256 BYTE), 
    "active" CHAR(1 BYTE)
   ) SEGMENT CREATION IMMEDIATE 
  PCTFREE 10 PCTUSED 40 INITRANS 1 MAXTRANS 255 
 NOCOMPRESS LOGGING
  STORAGE(INITIAL 65536 NEXT 1048576 MINEXTENTS 1 MAXEXTENTS 2147483645
  PCTINCREASE 0 FREELISTS 1 FREELIST GROUPS 1
  BUFFER_POOL DEFAULT FLASH_CACHE DEFAULT CELL_FLASH_CACHE DEFAULT)
  TABLESPACE "TESTTABLESPACE" ;
Run Code Online (Sandbox Code Playgroud)

小智 7

您使用双引号创建了列,因此现在 Oracle 要求您始终使用标识符并尊重大小写来引用此列。如果删除双引号,Oracle 总是将名称转换为大写,因此如果没有双引号,则不区分大小写。

如果您创建的列没有标识符,这将起作用:

where rulE_id
where RULE_ID
Run Code Online (Sandbox Code Playgroud)

同样在创建表时,不需要引号,除非您使用保留字。