Oracle - 仅当source不为null时才更新列

时间:2017-02-09 16:13:31

标签: sql oracle

我有一个在包中动态生成的更新语句。

我需要仅在target_field2source_field2时更新NOT NULL,如果NULL,则保持target_field2原样。

希望有一个简单的答案。这是关注的动态部分:

                 ELSIF cur_field_to_update.FIELD_NAME = 'SOURCE_FIELD2'
                 THEN
                    v_update_values := 
                        v_update_values
                        || ', CASE WHEN NVL('''
                        || data_cur.IND_TYPE
                        || ''', NULL) <> ''D'' THEN NULL ELSE TO_NUMBER(NVL('
                        || cur_field_to_update.FIELD_NAME
                        || ','
                        || TARGET_FIELD2
                        || ')) END';

最终看起来像..

UPDATE target_table 
SET (target_field1,target_field2) = 
(SELECT source_field1, 
CASE WHEN NVL('A',NULL) <> 'A' 
THEN NULL   
ELSE TO_NUMBER(NVL(source_field2,target_field2))
END 
FROM source_table);

4 个答案:

答案 0 :(得分:3)

如果您需要无条件地更新一个字段,但只有在新值不为空时才更新另一个字段,则可以使用NVL()在新值和旧值之间进行选择:

update your_table set
 target_1 = source_1,
 target_2 = NVL(source_2, target_2)
where ...

如果从select语句更新,则可以执行以下操作:

update target_table set
  (target_1, target_2) = (
    select source_1, 
           (NVL(source_2, 
               (select target_2 from target_table tt
                where tt.target_key = key_value)))
  )
where target_key = key_value;

这假设target_key是唯一键,因此我们正在更新相同的记录。

如果你有更复杂的逻辑,那么放入PL / SQL可能更容易,也不容易出错。

答案 1 :(得分:1)

如果source_field的值在同一行

update your_table 
set target_field2 = 'your_value'
where source_field2  is not null

或者如果值是source_field本身

update your_table 
set target_field2 =  suorce_field2
where source_field2  is not null

答案 2 :(得分:0)

这就是我做的。我将现有数据加载到变量中并对这些现有数据进行操作。

PROCEDURE UpdateInventoryCheck(vCondition in varchar2, vQtyOH in number,
                             vQtyAvail in number, vSN in varchar2, vLoc in varchar2,
                             vConsignment in varchar2, vNotes in varchar2,
                             vInventoryID in number) AS
cond varchar2(10);
qtyOH number;
qtyAvail number;
sn varchar2(40);
loc varchar2(15);
consig varchar2(20);
notes clob;

BEGIN

select      cond, qty_oh, qty_avail, serial_numb, loc, consignment, notes 
into        cond, qtyOH, qtyAvail, sn, loc, consig, notes
from        qctl2.inventory_check
where       inventory_id = vInventoryID;

update      qctl2.inventory_check
set         cond = nvl(vCondition, cond),
            qty_oh = nvl(vQtyOH, qtyOH),
            qty_avail = nvl(vQtyAvail, qtyAvail),
            serial_numb = nvl(vSN, sn),
            loc = nvl(vLoc, loc),
            consignment = nvl(vConsignment, consig),
            notes = nvl(vNotes, notes)
where       inventory_id = vInventoryID;
commit;

END UpdateInventoryCheck;

答案 3 :(得分:0)

更新target_table SET target_field1 = target_field1为null则为null的情况,否则值结束 哪里 条件。...