问题描述
我通过一个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 语句中,您用带引号的标识符或不带引号的标识符表示对象的名称。
- 带引号的标识符以双引号 (") 开头和结尾。如果使用带引号的标识符命名架构对象,则在引用该对象时必须使用双引号。
- 未加引号的标识符没有被任何标点符号包围。
...
- 未加引号的标识符必须以数据库字符集中的字母字符开头。带引号的标识符可以以任何字符开头。
您有一个以数字开头的标识符。这告诉您解决方案是使用带引号的标识符并用双引号将列名括起来:
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;