我有一张表格如下:
TABLE_1
{
Name varchar2(30)
Value_a number
Update_time timestamp
}
我希望在INSERT + MERGE期间有条件地更新update_time的值,具体取决于“value_a”的值。如果value_a小于0.1,则检查update_time是否为null。如果是,那么更新别的不。如果value_a大于0.1,则检查update_time是否为空。如果是,那么make null。
我有一个table_1_stage,我清除了,然后插入所有数据,然后在table_1中“合并或插入”,具体取决于键匹配。我正在使用oracle 11g。
我的准备语句如下所示:" MERGE INTO "
+ TABLE_1
+ " TABLE1 "
+ " USING TABLE_1_STAGE TABLE1S "
+ " ON (TABLE1.NAME = TABLE1S.NAME ) "
+ " WHEN MATCHED THEN "
+ " UPDATE set VALUE_A = TABLE1S.VALUE_A "
+ " WHEN NOT MATCHED THEN "
+ " INSERT ( NAME, VALUE_A) "
+ " VALUES (?, ?) "
update_time列是新的,我需要根据value_a设置/重置它。
我知道存储过程可能是一个更好的调用,但我在查看是否可以在插入查询中执行某些操作来执行此操作?
答案 0 :(得分:2)
Update table1
set Update_time = (case when value_a < 0.1 and Update_time is null then sysdate
when value_a > 0.1 and Update_time is not null then null
else Update_time end);
将sysdate更改为您想要的值。
修改强>
在合并声明中包含编辑。请参阅以下查询(未使用实际数据进行测试) 这样我们就不会在整个表上运行更新。
Merge into table1 t1
using table1_staging t1s
on t1.name = t1s.name
when matched then
update t1.value_a = t1s.value_a,
t1.Update_time = (case when t1s.value_a < 0.1 and t1.Update_time is null then sysdate
when t1s.value_a > 0.1 and t1.Update_time is not null then null
else t1.Update_time end)
when not matched then
INSERT (name, values_a)
VALUES (t1s.name, t1s.values_a);
答案 1 :(得分:0)
您的逻辑非常适合update
语句。我想这就是你想要的:
update table1
set update_time = sysdate
where update_time is null and value_a < 0.1 or
update_time is not null and value_a > 0.1;
您没有说明要将update_time
设置为值。我认为这是当前时间。
答案 2 :(得分:0)
我的解决方案消除了根据您的数据更新可能性能较差的整个表:
update table1 set update_time = (
select case when value_a > 0.1 and update_time is not null then null when value_a < 0.1 and update_time is null then sysdate) where update_time is null and value_a < 0.1 or update_time is not null and value_a > 0.1;