MYSQL сервер - обновлять только значение, если не ноль - PullRequest
0 голосов
/ 09 октября 2018

Я хотел бы обновить значение, только если оно не пустое или пустое, но я перепробовал все от COALESCE(new_value, old_value) до COALESCE(NullIf(RTrim(new_value),'')old_value).

Я совершенно потерян для идейи я просматривал Интернет для решения, но я не могу найти ничего, что работает для меня.

$query = "UPDATE Person SET fornavn=COALESCE($escapedFornavn,fornavn), efternavn='$escapedEfternavn', alder='$escapedAlder', email='$escapedEmail', adresse='$escapedAdresse', telefon=$escapedTelefon WHERE brugernavn='$brugernavn'; ";

Я хочу, чтобы запрос выше обновлял каждое значение, только если пользователь набрал взначение в форме, если форма пуста, следует просто использовать старое значение.

Ответы [ 3 ]

0 голосов
/ 09 октября 2018

Вам следует рассмотреть возможность использования UPDATE SELECT для получения данных в запросе, а затем использовать

 SET target.column = IF(source.column is invalid, target.column, source.column)

Когда вы устанавливаете столбец для себя, вы не изменяете его.

Вот возможный пример.

UPDATE p
   SET p.col1 = IF(q.col1 IS NULL OR LENGTH(q.col1) = 0, p.col1, q.col1),
       p.col1 = IF(q.col2 IS NULL OR LENGTH(q.col2) = 0, p.col2, q.col2),
       p.col1 = IF(q.col3 IS NULL OR LENGTH(q.col3) = 0, p.col3, q.col3),
               ...
 FROM Person AS p
 JOIN (
       SELECT 
           <<<value1>> col1,
           <<<value2>> col2,
           <<<value3>> col3,
               ...
      ) AS q
WHERE <<<whatever condition>>>
0 голосов
/ 09 октября 2018

Вы можете сделать это, если используете функцию 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() всякий раз, когда вы собираетесь его отобразить:

0 голосов
/ 09 октября 2018

Как предлагается в комментариях, обработайте это в приложении.Я надеюсь, что этот запрос будет как-то полезен.

UPDATE Person SET fornavn=IF(fornavn is NULL,NULL,new_value);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...