Обновить поле, когда не 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=?