Обновить поле, когда оно не пустое - PullRequest
13 голосов
/ 07 декабря 2009

У меня есть оператор update, который обновляет поля x, y и z, где id = xx.

В таблице у меня есть несколько разных полей x_created_datetime (для разных частей записи, которые ведутся / вводятся разными людьми). Я хотел бы написать один запрос, который будет обновлять это поле, если оно равно нулю, но оставить его в покое, если оно не равно нулю.

Итак, что у меня есть:

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

Я надеюсь, что смогу сделать это без второй транзакции в БД. Любые идеи о том, как это сделать?

Ответы [ 6 ]

32 голосов
/ 07 декабря 2009

Сделайте это:

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 выбирает первое ненулевое значение. В этом случае он обновит datetamp scan_created_date таким же значением, если оно существует, иначе он примет все, что вы замените "current_unix_timestamp" на.

4 голосов
/ 07 декабря 2009

Я думаю, что вы ищете 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 голосов
/ 07 декабря 2009

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
2 голосов
/ 07 декабря 2009

Вы можете использовать COALESCE (), который возвращает первое значение, не равное NULL):

scan_created_date = COALESCE(scan_created_date, "current_unix_timestamp")
1 голос
/ 07 декабря 2009

Вы можете сделать что-то вроде этого:

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
0 голосов
/ 30 сентября 2013

Это как эквивалент Oracle NVL. Вы можете использовать его, как показано ниже, в подготовленном выражении, используя параметры

UPDATE
    tbl_cccustomerinfo
SET
    customerAddress = COALESCE(?,customerAddress),
    customerName =  COALESCE(?,customerName),
    description =  COALESCE(?,description)
WHERE
    contactNumber=?
...