как сделать значения NULL в UPDATE оставить столбец без изменений - PullRequest
0 голосов
/ 05 мая 2019

Я хочу обновить данные в таблице SQLite из приложения Node.js.

Предположим, у меня есть таблица "вещей" с 3 столбцами: "id", "code" и "name".

Итак, я создаю экспресс-маршрут PUT, в котором я строю инструкцию SQL UPDATE с некоторыми переменными, извлеченными из проанализированного тела.

app.put("/:id",function (req, res, next) {
  db.run("UPDATE things SET code=?, name=? WHERE id=?",
     [req.body.code,req.body.name,req.params.id],
     function(err) {
       ...
  })
}

Я могу обновить свою таблицу с помощью поставленного глагола

curl --header 'Content-Type: application/json' \
     --request PUT \
     --data '{"code":"ALC","name":"Alice"}' \
     http://localhost:3000/1

пока, так хорошо.

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

curl --header 'Content-Type: application/json' \
     --request PUT \
     --data '{"name":"Anna"}' \
     http://localhost:3000/1

однако, результат этой операции устанавливает столбец «код» в NULL, а не оставляет его неизменным.

Можно ли написать оператор UPDATE, который может привести к такому результату? или мне нужно динамически создавать различные операторы UPDATE?

В примере будет три в зависимости от того, хочу ли я изменить один, другой или оба столбца? но это станет очень неудобным в реальном сценарии с более чем 20 возможными столбцами обновления.

1 Ответ

0 голосов
/ 05 мая 2019

Попробуйте использовать функцию COALESCE, чтобы установить для столбца его текущее значение, если для этого столбца установлен параметр NULL.Это стандарт ISO SQL, за исключением имен параметров.Я не знаю, какую СУБД вы используете, но я предполагаю, что она поддерживает именованные параметры (все современные базы данных СУБД поддерживают именованные параметры, но используют свой собственный синтаксис)

UPDATE
    foo
SET
    Col1 = COALESCE( @param1, Col1 ),
    Col2 = COALESCE( @param2, Col2 ),
    Col3 = COALESCE( @param3, Col3 )
WHERE
    PrimaryKeyCol = @primaryKey
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...