首页 > 解决方案 > Oracle 数据库中的虚拟列

问题描述

我在表中有 5 列。我必须存储difference of max value and min value在另一个column. 我正在使用以下查询。这a b c d e是列名。

ALTER TABLE samples ADD
(Range_value NUMBER(10,2) GENERATED ALWAYS
 AS (max(a,b,c,d,e)-Min(a,b,c,d,e)) VIRTUAL);

我得到以下错误。

Error starting at line : 28 in command -
ALTER TABLE samples ADD
(Range_value NUMBER(10,2) GENERATED ALWAYS
 AS (max(a,b,c,d,e)-Min(a,b,c,d,e)) VIRTUAL)
Error report -
ORA-00934: group function is not allowed here
00934. 00000 -  "group function is not allowed here"
*Cause:    
*Action:

如果不允许使用组功能,是否有解决方法?

标签: sqldatabaseoracleplsqloracle12c

解决方案


我建议你使用 GREATEST 和 LEAST

ALTER TABLE samples ADD
(Range_value NUMBER(10,2) GENERATED ALWAYS
 AS (GREATEST (a,b,c,d,e)-LEAST(a,b,c,d,e)) VIRTUAL);

见:db<>fiddle here

这些函数适用于当前行,可用于您的虚拟列,而 MIN/MAX 跨多行操作,不能用于您的虚拟列。

如果您确实需要跨多行操作,那么视图可能是最简单的选择。


推荐阅读