У меня есть функция 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;