基于另一列的值插入(Oracle 11g)

时间:2014-03-05 17:37:48

标签: sql oracle oracle11g insert-update

我有一张表格如下:

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设置/重置它。

我知道存储过程可能是一个更好的调用,但我在查看是否可以在插入查询中执行某些操作来执行此操作?

3 个答案:

答案 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;