Обновить поле, когда не Null
У меня есть инструкция update, которая обновляет поля x, y и z, где id = xx.
В таблице у меня есть несколько разных полей x_created_datetime (для разных частей записи, которые поддерживаются/вводятся разными людьми). Я хотел бы написать один запрос, который будет обновлять это поле, если имеет значение null, но оставьте его в покое, если оно не равно null.
Итак, у меня есть:
UPDATE newspapers
SET scan_notes = "data",
scan_entered_by = "some_name",
scan_modified_date = "current_unix_timestamp"
WHERE id = X
Мне нужен способ добавить следующее, но все равно всегда обновляйте выше:
scan_created_date = "current_unix_timestamp"
where scan_created_date is null
Я надеюсь, что смогу сделать это без второй транзакции с БД. Любые идеи о том, как это сделать?
Ответы
Ответ 1
Сделайте это:
UPDATE newspapers
SET scan_notes = "data",
scan_entered_by = "some_name",
scan_modified_date = "current_unix_timestamp",
scan_created_date = COALESCE(scan_created_date, "current_unix_timestamp")
WHERE id = X
Функция COALESCE
выбирает первое ненулевое значение. В этом случае он обновит datestamp scan_created_date до того же значения, если он существует, иначе он примет все, что вы замените "current_unix_timestamp"
.
Ответ 2
Я думаю, что вы ищете IF()
UPDATE newspapers
SET scan_notes = "data",
scan_entered_by = "some_name",
scan_modified_date = "current_unix_timestamp",
scan_created_date = IF(scan_created_date IS NOT NULL, "current_unix_timestamp", NULL)
WHERE id = X
Ответ 3
mySQL имеет IFNULL
, поэтому вы можете сделать:
UPDATE newspapers
SET scan_notes = "data",
scan_entered_by = "some_name",
scan_modified_date = "current_unix_timestamp"
scan_created_date = IFNULL( scan_created_date, "current_unix_timestamp" )
WHERE id = X
Ответ 4
Вы можете использовать COALESCE(), который возвращает первое значение NON-NULL):
scan_created_date = COALESCE(scan_created_date, "current_unix_timestamp")
Ответ 5
Вы можете сделать что-то вроде этого:
UPDATE newspapers a, newspapers b
SET a.scan_notes = "data",
a.scan_entered_by = "some_name",
a.scan_modified_date = "current_unix_timestamp",
b.scan_created_date = "current_unix_timestamp"
WHERE a.id = X AND b.id = X AND b.scan_created_date is not NULL
Ответ 6
Это похоже на Oracle NVL.
Вы можете использовать его, как показано ниже в подготовленном сообщении, используя параметры
UPDATE
tbl_cccustomerinfo
SET
customerAddress = COALESCE(?,customerAddress),
customerName = COALESCE(?,customerName),
description = COALESCE(?,description)
WHERE
contactNumber=?