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
Другие вопросы по тегам