我有一个在包中动态生成的更新语句。
我需要仅在target_field2
为source_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);
答案 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的情况,否则值结束 哪里 条件。...