Необязательное обновление столбца, если предоставленное значение для столбца не равно нулю - PullRequest
0 голосов
/ 21 декабря 2018

У меня есть следующая таблица:

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
);

Я использую pg-promise, и я хочу предоставить дополнительное обновление столбцов:

categories.update = function (categoryTitle, toUpdateCategory) {
  return this.db.oneOrNone(sql.update, [
          categoryTitle,
          toUpdateCategory.title, toUpdateCategory.category_type, toUpdateCategory.description,
        ])
}
  • categoryName -требуется
  • toUpdateCategory.title - требуется
  • toUpdateCategory.category_type - необязательно (может быть передано или не определено)
  • toUpdateCategory.description - необязательно (может быть передано илиundefined)

Я хочу построить 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 *;

Как мне добиться этого необязательного обновления столбца в Postgres?

Ответы [ 2 ]

0 голосов
/ 22 декабря 2018

Синтаксис helpers лучше всего подходит для любой динамической логики с pg-prom :

/* logic for skipping columns: */
const skip = c => c.value === null || c.value === undefined;

/* reusable/static ColumnSet object: */
const cs = new pgp.helpers.ColumnSet(
    [
        'title',
        {name: 'category_type', skip},
        {name: 'description', skip}
    ],
    {table: 'categories'});

categories.update = function(title, category) {
   const condition = pgp.as.format(' WHERE title = $1', title);
   const update = () => pgp.helpers.update(category, cs) + condition;
   return this.db.none(update);
}

И если ваши необязательные свойства столбца даже несуществуют на объекте, когда они не указаны, вы можете упростить логику пропуска только до этого (см. Логика столбца ):

const skip = c => !c.exists;

Используемый API: ColumnSet , helpers.update .

См. Также очень похожий вопрос: Пропустить обновление столбцов с помощью pg-обещания .

0 голосов
/ 21 декабря 2018

Вы можете coalesce между старым и новым значениями:

UPDATE categories
SET title=$2,
    category_type = COALESCE($3, category_type),
    description = COALESCE($4, description) -- etc...
WHERE title = $1
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...