如何使UPDATE中的NULL值使列保持不变

时间:2019-05-05 15:58:59

标签: node.js sqlite

我想从Node.js应用程序更新SQLite表中的数据。

假设我有一个包含3列的“物”表:“ id”,“ code”和“ name”。

因此,我创建了一条明确的PUT路由,在其中构建了一个UPDATE SQL语句,并使用了从已解析主体中提取的一些变量。

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) {
       ...
  })
}

我可以用put动词更新表

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 :(得分:0)

如果为该列提供的参数为COALESCE,请尝试使用NULL函数将该列设置为其当前值。除了参数名称外,这是ISO SQL标准的东西。我不知道您使用的是哪种RDBMS,但是我假设它支持命名参数(所有现代RDBMS数据库都支持命名参数,但是使用它们自己的不同语法)

UPDATE
    foo
SET
    Col1 = COALESCE( @param1, Col1 ),
    Col2 = COALESCE( @param2, Col2 ),
    Col3 = COALESCE( @param3, Col3 )
WHERE
    PrimaryKeyCol = @primaryKey