UPSERT + DELETE для NULL в одном запросе PostgreSQL (MERGE?) - PullRequest
0 голосов
/ 01 апреля 2019

У меня есть функция PostgreSQL, которая возвращает одно значение BLOB-объекта или NULL: gettile(z,x,y). Я хотел бы сохранить результат в таблице tiles со столбцами z int, x int, y int, data blob в одном операторе SQL.

Таблица tiles должна быть обновлена ​​в зависимости от результата:

  • если такой комбинации z,x,y нет, INSERT новая строка.
  • если есть, UPDATE значение
  • если gettile() возвращает NULL, DELETE строку или игнорировать, если она не существует.

Первые два можно сделать с помощью UPSERT, но есть ли способ упростить все 3 операции?

В идеале этот запрос необходимо изменить для поддержки сценария DELETE:

WITH vals (z,x,y) AS (VALUES (0,0,0), (1,0,0), (1,1,0))
INSERT INTO tiles (z,x,y,data)
SELECT z, x, y, gettile(z,x,y) AS data FROM vals
ON CONFLICT (z,x,y) DO UPDATE
    SET data = excluded.data;
...