0

我通过一个 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,2018,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, 2018_V, 2019_V,
               ^
1 statement failed.

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

4

2 回答 2

2

数据库对象名称和限定符文档中:

数据库对象命名规则

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

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

...

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

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

select x,
       "2017_V",
       "2018_V",
       "2019_V",
       "2017_D",
       "2018_D",
       "2019_D" 
from   MYTAB;
于 2020-12-31T22:40:36.277 回答
1

一种选择是在创建表时,不要创建以数字开头的列。在执行 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;
于 2020-12-31T15:01:04.393 回答