我有一个像这样的观点:
SELECT NVL(foo, 0) foo FROM bar
不幸的是,这种观点忽略了bar.foo
为NUMBER(1)
的事实,而只是将其指定为NUMBER
。我想保留类型信息,所以我这样做了:
SELECT CAST(NVL(foo, 0) AS NUMBER(1)) foo FROM bar
这很有效,但如果我有很多像foo
这样的列,我需要复制类型信息。我是否会改变其中一个的精度,我也必须在视图中更改它,否则可能会失去精度。理想情况下,我想做这样的事情:
SELECT CAST(NVL(foo, 0) AS TYPE(foo)) foo FROM bar
这可能,如果可能,怎么样?
答案 0 :(得分:2)
我不认为这是可能的,因为在更改基表时会隐式更改视图定义。
您可能希望完全避免插入NULL
数据:如果您的业务逻辑允许将列限制为NOT NULL
,则可以在客户端实现NLV(foo,0)
逻辑或使用BEFORE INSERT
触发器将所有NULL
插入内容转换为0
:
CREATE TABLE T1(
foo NUMBER(1) NOT NULL
);
CREATE TRIGGER TRG1 BEFORE INSERT ON T1
FOR EACH ROW
BEGIN
:new.foo := NVL(:old.foo, 0);
END;
/
然后你可以
INSERT INTO T1 VALUES (NULL);
SELECT * FROM T1;
将为您提供0