Oracle SQL,列名给出 ORA-00911:无效字符

问题描述

我通过一个pivot语句创建了一个表,它会自动创建一些以数字开头的变量名。

create table MYTAB as
select *
from (select x,anno,v,delta from tab_a13_2 where anno in(2017,2018,2019))
pivot(sum(v)  as v,sum(delta) as d for anno in (2017,2019)) 
where ordine > 0
order by ordine;

select * from MYTAB;
x 2017_V    2017_D  2018_V  2018_D  2019_V  2019_D
1   1.01    -3.18     1.04   11.18    0.96   -6.87
2   1.28     0.09     1.28    7.33    1.25   -1.49
...

但是,如果我尝试在选择中指定列名,则会收到此错误

select x,2017_V,2018_V,2019_V,2017_D,2018_D,2019_D 
from MYTAB;

Error at line 5:
ORA-00911: invalid character
           2017_V,^
1 statement Failed.

我不明白。要么我不允许创建以数字开头的列名,因此表创建应该失败,要么我应该能够使用它们。 我检查了列名没有被引用,即“2017_V”。

解决方法

来自 Database Object Names and Qualifiers 文档:

数据库对象命名规则

每个数据库对象都有一个名称。在 SQL 语句中,您用带引号的标识符或不带引号的标识符表示对象的名称。

  • 带引号的标识符以双引号 (") 开头和结尾。如果使用带引号的标识符命名架构对象,则在引用该对象时必须使用双引号。
  • 未加引号的标识符没有被任何标点符号包围。

...

  1. 未加引号的标识符必须以数据库字符集中的字母字符开头。带引号的标识符可以以任何字符开头。

您有一个以数字开头的标识符。这告诉您解决方案是使用带引号的标识符并用双引号将列名括起来:

select x,"2017_V","2018_V","2019_V","2017_D","2018_D","2019_D" 
from   MYTAB;
,

一种选择是,在创建表格时,不要创建以数字开头的列。执行 PIVOT 时,您可以为 IN 子句中的值设置别名,以便从数据透视生成的列对用户更加友好。尝试使用如下语句创建您的表:

  SELECT *
    FROM (SELECT x,anno,v,delta
            FROM tab_a13_2
           WHERE anno IN (2017,2018,2019))
         PIVOT (SUM (v) AS v,SUM (delta) AS d
               FOR anno
               IN (2017 AS year_2017,2018 AS year_2018,2019 AS year_2019))
   WHERE ordine > 0
ORDER BY ordine;