如何根据提供的数据 "Smart Update" 条目?
How to "Smart Update" an entry based on provided data?
是否可以编写 SQL UPDATE
仅在实际提供数据时才更改列?
假设我正在更新 post。 post
有一个 id
、author
、title
和 text
。更新 post 时,title
和 text
之一或两者都可以更改。
是否有 SQL 查询可以根据提供的数据动态更改 UPDATE
?在 Nodejs 中它可能看起来像这样 pg:
const result = await pgClient.query("UPDATE post SET title = , text = WHERE userId = ",
["new title", undefined, "12345"]);
附加条款说“如果未定义,不更新。”
这样的事情怎么样:
UPDATE post
SET title = CASE WHEN IS NULL THEN title ELSE END
....
使用COALESCE()
:
UPDATE post
SET title = COALESCE(, title)
, text = COALESCE(, text)
WHERE userId =
AND (title <> OR text <> );
此外,添加一个额外的 WHERE
子句以跳过不会更改任何内容(但成本相同)的更新。
在您的情况下,至少有一个非空参数实际上必须不同才能产生影响。
如果列本身可以是 NULL
,请改用:
...
AND ( IS NOT NULL AND title IS DISTINCT FROM
OR IS NOT NULL AND text IS DISTINCT FROM );
参见:
- How do I (or can I) SELECT DISTINCT on multiple columns?
是否可以编写 SQL UPDATE
仅在实际提供数据时才更改列?
假设我正在更新 post。 post
有一个 id
、author
、title
和 text
。更新 post 时,title
和 text
之一或两者都可以更改。
是否有 SQL 查询可以根据提供的数据动态更改 UPDATE
?在 Nodejs 中它可能看起来像这样 pg:
const result = await pgClient.query("UPDATE post SET title = , text = WHERE userId = ",
["new title", undefined, "12345"]);
附加条款说“如果未定义,不更新。”
这样的事情怎么样:
UPDATE post
SET title = CASE WHEN IS NULL THEN title ELSE END
....
使用COALESCE()
:
UPDATE post
SET title = COALESCE(, title)
, text = COALESCE(, text)
WHERE userId =
AND (title <> OR text <> );
此外,添加一个额外的 WHERE
子句以跳过不会更改任何内容(但成本相同)的更新。
在您的情况下,至少有一个非空参数实际上必须不同才能产生影响。
如果列本身可以是 NULL
,请改用:
...
AND ( IS NOT NULL AND title IS DISTINCT FROM
OR IS NOT NULL AND text IS DISTINCT FROM );
参见:
- How do I (or can I) SELECT DISTINCT on multiple columns?