首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >引用另一个虚拟列的虚拟列定义

引用另一个虚拟列的虚拟列定义
EN

Stack Overflow用户
提问于 2016-03-18 14:23:07
回答 1查看 1.6K关注 0票数 1

是否可能有一个虚拟列,其列表达式定义引用了以前在表上定义的另一个虚拟列?列表达式的文档说:

定义column_expression必须仅引用已在当前语句或先前语句中定义的主题表的列。

这是一个简单的示例,说明了我要做的事情,第三个虚拟列指的是已经定义的其他虚拟列:

代码语言:javascript
运行
复制
create table numberManipulation
(
  value1 VARCHAR2 (10),
  Value2 VARCHAR2 (10),
  Addition AS  (DECODE (value1, 'late', 1, 0) + DECODE (value2, 'late', 1, 0)),
  subtraction AS(DECODE (value1, 'present', 1, 0) + DECODE (value2, 'present', 1, 0)),
  Compile AS (ADDITION + SUBTRACTION)
);

但这会导致错误:

代码语言:javascript
运行
复制
ORA-54012: virtual column is referenced in a column expression

我想做的事有可能吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-03-18 14:26:23

不,虽然列表达式的文档没有明确表示不能。但是,我的Oracle文档466916.1和文档中都显示了这个限制

AS子句中的column_expression具有以下限制:

  • 它不能按名称引用另一个虚拟列。 ..。

您必须从第三个虚拟列中的每个虚拟列重复计算:

代码语言:javascript
运行
复制
create table numberManipulation
(
  value1 VARCHAR2 (10),
  Value2 VARCHAR2 (10),
  Addition AS  (DECODE (value1, 'late', 1, 0) + DECODE (value2, 'late', 1, 0)),
  subtraction AS(DECODE (value1, 'present', 1, 0) + DECODE (value2, 'present', 1, 0)),
  Compile AS (DECODE (value1, 'late', 1, 0) + DECODE (value2, 'late', 1, 0)
    + DECODE (value1, 'present', 1, 0) + DECODE (value2, 'present', 1, 0))
);

Table NUMBERMANIPULATION created.

或者稍微简单一点:

代码语言:javascript
运行
复制
  Compile AS (DECODE (value1, 'late', 1, 'present', 1, 0)
    + DECODE (value2, 'late', 1, 'present', 1, 0))

..。尽管您可能更愿意保持两个较长的表达式与前面的列匹配,以保持一致性和维护性。

让一个虚拟列引用另一个列将规定它们必须计算的顺序,并可能导致循环依赖。

另一种方法是有一个视图,该视图从基表中的两个虚拟列计算最后一列:

代码语言:javascript
运行
复制
create table numberManipulation
(
  value1 VARCHAR2 (10),
  Value2 VARCHAR2 (10),
  Addition AS  (DECODE (value1, 'late', 1, 0) + DECODE (value2, 'late', 1, 0)),
  subtraction AS(DECODE (value1, 'present', 1, 0) + DECODE (value2, 'present', 1, 0))
);

Table NUMBERMANIPULATION created.

create view vNumberManipulation as
select numberManipulation.*, addition + subtraction as compile
from numberManipulation;

View VNUMBERMANIPULATION created.

insert into numberManipulation (value1, value2) values ('late', 'late');
insert into numberManipulation (value1, value2) values ('late', 'present');
insert into numberManipulation (value1, value2) values ('present', null);
select * from vNumberManipulation;

VALUE1     VALUE2        ADDITION  SUBTRACTION      COMPILE
---------- ---------- ----------- ------------ ------------
late       late                 2            0            2
late       present              1            1            2
present                         0            1            1

视图也不能引用自己的列,因此仍然需要基表中的加法和减法。您还可以在视图上设置一个触发器,这样试图修改视图实际上会更改基表,这将使其更加方便用户。

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/36086816

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档