Change
。Change
列值将是列 open 和 close(关闭-打开)的差值。日期时间 | 打开 | 关闭 | 改变 |
---|---|---|---|
2000年3月14日 | 1561.55 | 1567.05 | |
2000年3月15日 | 1546.8 | 1620.1 | |
2000年3月16日 | 1620.4 | 1562.2 | |
2000年3月21日 | 1563.3 | 1556.6 |
我正在尝试使用以下查询,但出现错误
SQL 错误:ORA-00936:缺少表达式
insert into T1(change)
values
(
select
case when open<close then close-open
when open>close then close-open
end as change
from T1
order by datetime
);
当您想要填充现有行的列时,您可以使用
update
语句,而不是 insert
语句。只需使用更新语句并应用 set
子句中的表达式即可:
update t1 set change = close-open;
但是,存储派生值并不是一个好的设计实践。如果某人或某些代码更新组件列之一并且忘记更新派生列,会发生什么情况?通过这种方式,您可以轻松获得不一致的数据。最好在查询时计算派生列而不是存储它们。只需在查询原始表时使用的 select 语句中执行此操作即可:
select t1.*,close-open change from t1
如果有一个相当一致使用的公式,那么您可能需要向表中添加一个“虚拟列”,这将在查询时为您应用该公式,就像该值存储在表中一样,尽管事实并非如此 -在幕后,它只是在您查询时计算公式:
alter table t1 add (change number as (close-open) virtual);
现在查询:
select * from t1
或者创建一个嵌入公式的视图:
create view v1 as select t1.*,close-open change from t1
现在查询:
select * from v1
您有很多选项可让您在查询时获取派生值,因此您不必将其实际存储在表中,也不必冒数据不一致的风险。但如果您确实想物理存储它,请使用简单的
update
语句。