如果提供的列值不为空,则可选列更新

Ale*_*dko 7 sql postgresql sql-update pg-promise

我有下表:

CREATE TABLE IF NOT EXISTS categories
(
    id SERIAL PRIMARY KEY,
    title CHARACTER VARYING(100) NOT NULL,
    description CHARACTER VARYING(200) NULL,
    category_type CHARACTER VARYING(100) NOT NULL
);
Run Code Online (Sandbox Code Playgroud)

我正在使用pg-promise,并且我想提供可选的列更新:

categories.update = function (categoryTitle, toUpdateCategory) {
  return this.db.oneOrNone(sql.update, [
          categoryTitle,
          toUpdateCategory.title, toUpdateCategory.category_type, toUpdateCategory.description,
        ])
}
Run Code Online (Sandbox Code Playgroud)
  • categoryName- 是必须的
  • toUpdateCategory.title- 是必须的
  • toUpdateCategory.category_type- 是可选的(可以传递或未定义)
  • toUpdateCategory.description- 是可选的(可以传递或未定义)

我想构建UPDATE查询以仅更新提供的列:

UPDATE categories
SET title=$2,
// ... SET category_type=$3 if $3 is no NULL otherwise keep old category_type value
// ... SET description=$4 if $4 is no NULL otherwise keep old description value
WHERE title = $1
RETURNING *;
Run Code Online (Sandbox Code Playgroud)

如何在 Postgres 中实现此可选列更新?

Mur*_*nik 8

您可以coalesce在旧值和新值之间:

UPDATE categories
SET title=$2,
    category_type = COALESCE($3, category_type),
    description = COALESCE($4, description) -- etc...
WHERE title = $1
Run Code Online (Sandbox Code Playgroud)