Oracle COALESCE или NVL
У меня есть хранимая процедура, и я хочу обновить значение в таблице с помощью SYSDATE, только если параметр NOT NULL.
В следующем SQL я хочу установить SYSENDDATE в NULL, если pETime IS NULL, в противном случае в SYSDATE
UPDATE OLCACT SET
ENDDATE = pETime,
SYSENDDATE = SYSDATE,
GRD = pGRD,
PASS = v_pass
Не уверен, как использовать NVL или COALESCE для этого.
3 ответа
nvl2
(да, "отличное" имя, я знаю) на самом деле будет гораздо удобнее:
UPDATE OLCACT SET
ENDDATE = pETime,
SYSENDDATE = NVL2(pETime, SYSDATE, NULL)
GRD = pGRD,
PASS = v_pass
Как говорит @Mureinik, nvl2
это совершенно правильный способ сделать это. Несмотря на то, что это встроенная функция, она не особенно хорошо названа или хорошо известна, поэтому я стараюсь ее избегать. Слишком легко случайно прочитать это как nvl
или для кого-то, чтобы не вспомнить точно, что делает эта функция. Я бы предпочел использовать CASE
заявление, которое разъясняет мои намерения
UPDATE OLCACT SET
ENDDATE = pETime,
SYSENDDATE = (CASE WHEN pETime IS NOT NULL
THEN sysdate
ELSE null
END)
GRD = pGRD,
PASS = v_pass
Это немного более многословно, чем nvl2
вариант. Но более вероятно, что случайный разработчик, смотрящий на него в будущем, сможет сразу понять, что он делает.
Вы можете использовать либо NVL2
или же CASE
:
UPDATE OLCACT SET
ENDDATE = pETime,
SYSENDDATE = CASE
WHEN pETime IS NOT NULL
THEN SYSDATE
ELSE NULL
END,
GRD = pGRD,
PASS = v_pass