MYSQL: использование ON DUPLICATE KEY UPDATE + COALESCE

0

Я написал ниже хранимую процедуру, которая вставляет записи для определенной даты. Если дата повторяется, то необходимо обновить значения. Но при вставке новой записи за ту же дату, если какое-либо значение имеет значение null, она уже добавляет значения для этой даты. Моя хранимая процедура:

CREATE PROCEDURE sp_setrecords (IN daten date,IN daystart time,IN lunchstart time,IN lunchend time,IN breakstart time,IN breakend time,IN dayend time,IN casualleave time,IN sickleave time,IN holidays time,IN leavewithoutpay time)
    BEGIN
        insert into dailyrecord (date,daystart,lunchstart,lunchend,breakstart,breakend,dayend,casualleave,sickleave,holidays,leavewithoutpay) values              (daten,daystart,lunchstart,lunchend,breakstart,breakend,dayend,casualleave,sickleave,holidays,leavewithoutpay) 
        ON DUPLICATE KEY UPDATE 
        date = COALESCE(VALUES(date)),
        daystart = COALESCE(VALUES(daystart)),
        lunchstart = COALESCE(VALUES(lunchstart)),
        lunchend = COALESCE(VALUES(lunchend)), 
        breakstart = COALESCE(VALUES(breakstart)), 
        breakend = COALESCE(VALUES(breakend)),
        dayend = COALESCE(VALUES(dayend)),
        casualleave = COALESCE(VALUES(casualleave)), 
        sickleave = COALESCE(VALUES(sickleave)), 
        holidays = COALESCE(VALUES(holidays)),
        leavewithoutpay = COALESCE(VALUES(leavewithoutpay));
    END

Пример: начальные значения: "2018-01-02", "9:30:00", null, null, null, null, null, null, null, null, null "

то если я вставлю 13:30:30 на ту же дату во вторую позицию, он вернется:

"2018-01-02", нулевой "13:30:00", NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL"

Как я могу обновить значение только в том случае, если оно не является нулевым?

Теги:
database
stored-procedures

1 ответ

0

Вашему COALESCE() нужны дополнительные аргументы:

    ON DUPLICATE KEY UPDATE 
        date = COALESCE(VALUES(date), date),
        daystart = COALESCE(VALUES(daystart), daystart),
        lunchstart = COALESCE(VALUES(lunchstart), lunchstart),
        . . .

Это сначала сохранит новое значение, а затем существующее значение.

  • 0
    Спасибо. Я пытался, но не работает :(

Ещё вопросы

Сообщество Overcoder
Наверх
Меню