Вы можете сделать это, если используете функцию mysql COALESCE
, как предполагалось.Также nullif
требуется, но вы использовали его неправильно.
Когда вы генерируете этот код с помощью php, вы должны учитывать, как обрабатываются строковые значения по сравнению с null
значениями (строковые значения требуют кавычек, NULLне работает):
$query = "UPDATE Person SET fornavn=COALESCE('$escapedFornavn',fornavn)"
будет работать должным образом, если $esapedFornavn
является допустимой строкой.Однако, если $esapedFornavn==null
запрос будет выглядеть как первый, а вам нужен второй ...
UPDATE Person SET fornavn=COALESCE('',fornavn);
UPDATE Person SET fornavn=COALESCE(null,fornavn);
Итак, чтобы достичь того, что требуется, вы можете использовать nullif
, чтобы пуститьСтроки в реальные nulls
:
UPDATE Person SET fornavn=COALESCE(nullif('$escapedFornavn', ''),fornavn)
Базовые тесты:
SELECT COALESCE(nullif(null,''),"oldvalue") -- will return "oldvalue", so no update.
SELECT COALESCE(nullif("newvalue",''),"oldvalue") -- will return "newvalue", so the change is persisted.
Единственный недостаток: вы не можете установить что-либо для пустой строки, так как это сохранит старое значение:
SELECT COALESCE( NULLIF('', ''), "oldvalue") --returns oldvalue
Обходной путь - хранить вместо этого один пробел и использовать trim()
всякий раз, когда вы собираетесь его отобразить: