我必须根据以下逻辑更新表中的最后2列,该逻辑有42列。
注意:表值的设置方式是,当在列中遇到第一个空值时;该表肯定有10万条记录,它是中间表,上面的计算每周重复一次,并且表中有新值,然后每周都要计算最后两列。 / p>
例如:
C42 = C19 ( 20 - 1)
C41 = C(20) when 20 columns have some value and 21st column is null
试图创建存储过程,并打开了一个游标以获取值进行计算,但是在创建逻辑和基于逻辑更新每一行时存在问题。有人可以建议一种有效的方法来执行上述计算逻辑并更新每条记录。预先感谢
答案 0 :(得分:0)
如果我了解您在做什么,则不需要PL / SQL,只需要使用合并和一个case表达式进行简单的更新-可以承认,它们都有很多术语,所以有点笨拙。
使用一个简化的表,只需要担心四列,以及要更新的第41和42列:
create table your_table (c1 number, c2 number, c3 number, c4 number, c41 number, c42 number);
insert into your_table (c1, c2) values (11, 12);
insert into your_table (c1, c2, c3) values (23, 24, 25);
您可以通过以相反的顺序合并所有其他列来获得c42
值:
coalesce(c4, c3, c2, c1)
或您的情况:
coalesce(c40, c39, c38, c37, ..., c4, c3, c2, c1)
您可以使用类似case的表达式来获取该列的位置:
case
when c40 is not null then 40
when c39 is not null then 39
...
when c4 is not null then 4
when c3 is not null then 3
when c2 is not null then 2
when c1 is not null then 1
end;
您可以查询(使用我的简化表)来查看值:
select c1, c2, c3, c4,
coalesce(c4, c3, c2, c1) as c41,
case
when c4 is not null then 4
when c3 is not null then 3
when c2 is not null then 2
when c1 is not null then 1
end as c42
from your_table;
C1 C2 C3 C4 C41 C42
---------- ---------- ---------- ---------- ---------- ----------
11 12 12 2
23 24 25 25 3
您只需更新即可:
update your_table
set c41 = coalesce(c4, c3, c2, c1),
c42 =
case
when c4 is not null then 4
when c3 is not null then 3
when c2 is not null then 2
when c1 is not null then 1
end;
2 rows updated.
select * from your_table;
C1 C2 C3 C4 C41 C42
---------- ---------- ---------- ---------- ---------- ----------
11 12 12 2
23 24 25 25 3
如果这是您将要定期执行的操作,则可以创建这些虚拟列,以便自动计算并始终保持最新状态。