Oracle: есть ли простой способ сказать «если null сохранит текущее значение» в операторах слияния / обновления? - PullRequest
0 голосов
/ 22 сентября 2008

У меня довольно слабое понимание какой-либо более продвинутой функциональности оракула, но я думаю, что это возможно.

Допустим, у меня есть таблица со следующей схемой:

MyTable
  Id INTEGER,
  Col1 VARCHAR2(100),
  Col2 VARCHAR2(100)

Я хотел бы написать sproc со следующим

PROCEDURE InsertOrUpdateMyTable(p_id in integer, p_col1 in varcahr2, p_col2 in varchar2)

Что, в случае обновления, если значение в p_col1, p_col2 равно нулю, не будет перезаписывать Col1, Col2 соответственно

Итак, если у меня есть запись:

id=123, Col1='ABC', Col2='DEF'

exec InsertOrUpdateMyTable(123, 'XYZ', '098'); --results in id=123, Col1='XYZ', Col2='098'
exec InsertOrUpdateMyTable(123, NULL, '098');  --results in id=123, Col1='ABC', Col2='098'
exec InsertOrUpdateMyTable(123, NULL, NULL);   --results in id=123, Col1='ABC', Col2='DEF'

Есть ли простой способ сделать это без нескольких операторов SQL?

Я думаю, что мог бы быть способ сделать это с помощью оператора Merge, хотя я только немного знаком с ним.


EDIT: Cade Roux ниже предлагает использовать COALESCE, который прекрасно работает! Вот несколько примеров использования coalesce kewyord. И вот решение моей проблемы:

MERGE INTO MyTable mt
    USING (SELECT 1 FROM   DUAL) a
    ON (mt.ID = p_id)
    WHEN MATCHED THEN
        UPDATE
           SET mt.Col1 = coalesce(p_col1, mt.Col1), mt.Col2 = coalesce(p_col2, mt.Col2)
    WHEN NOT MATCHED THEN
        INSERT (ID, Col1, Col2)
        VALUES (p_id, p_col1, p_col2);

Ответы [ 2 ]

2 голосов
/ 22 сентября 2008

Измените вызов или оператор обновления, чтобы использовать

nvl(newValue, oldValue)

для нового значения поля.

1 голос
/ 22 сентября 2008

Использование MERGE и COALESCE? Попробуйте эту ссылку для примера

с

SET a.Col1 = COALESCE(incoming.Col1, a.Col1)
    ,a.Col2 = COALESCE(incoming.Col2, a.Col2)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...