像 type,level这些字眼都是oracle的保留字,在数据表设计的时候,应该避免将字段采用这样的保留字来命名,否则可能会产生一些异常,带来不便。

如果非要用来命名,该咋办呢?,可以用双引号将它引起来,比如

create or replace view work.v_alert as
select 0 as "type",--<--看这里----------
to_char(id) as sid,
to_date(time,'yyyy-MM-dd hh24:mi:ss') as time,
region,
(case when hotspot>=1 and dhw>=8 then 5
when hotspot>=1 and dhw<8 and dhw>=4 then 4
when hotspot>=1 and dhw<4 and dhw>0 then 3
when hotspot<1 and hotspot>0 then 2
else 1 end) as "level" --<--看这里----------
from

这样子命名,视图创建了是创建了,但使用过程中就有问题,比如这样用

select count(*),level from work.v_alert v group by level

就会报错,报ORA-01788。原因是level是保留字,oracle会特别处理。

我又发现,假如别名用双引号引起来,使用也有问题。比如我将上述视图创建语句这样写:

create or replace view work.v_alert as
select 0 as "alert_type",--<--看这里----------
to_char(id) as sid,
to_date(time,'yyyy-MM-dd hh24:mi:ss') as time,
region,
(case when hotspot>=1 and dhw>=8 then 5
when hotspot>=1 and dhw<8 and dhw>=4 then 4
when hotspot>=1 and dhw<4 and dhw>0 then 3
when hotspot<1 and hotspot>0 then 2
else 1 end) as "alert_level" --<--看这里----------
from

但还是报错,说是无法辨认alert_level。

select count(*),level from work.v_alert v group by

应该改为

select count(*),"alert_level" from work.v_alert v group by "alert_level"

其实alert_level已经不是保留字,创建视图时就没必要再加双引号了,去掉即可。

另外,在sql server里面,用别名比较简单,如

select alert_type=0 from table1;

就得到一个名为alert_type的字段,其值为0。但oracle对这类赋值别名,需要这样写:

select 0 as alert_type from table1;