Postgres - добавить к строке jsonb - PullRequest
0 голосов
/ 22 февраля 2020

В Postgres, у меня есть jsonb столбец foo, в котором хранится массив строк

["a","b","c"]

Мне нужен запрос, который добавляет другую строку к тому, что там в данный момент, по указанному index

e.g. Append "!" at index 1

run query: ["a","b","c"] -> ["a","b!","c"]
run again: ["a","b","c"] -> ["a","b!!","c"]
run again: ["a","b","c"] -> ["a","b!!!","c"]

Я реализовал это в Postgres v11.2 следующим образом

UPDATE my_table 
SET foo = jsonb_set(foo, '{1}', CONCAT('"', foo->>1, '!', '"')::jsonb) 
WHERE id = '12345';

Обратите внимание на индекс 1 и строку '!' здесь просто для простоты жестко прописаны - но они будут переменными.

Это работает, но я нахожу это довольно не элегантным. Как видите, я выбираю строку с указанным индексом как text, используя оператор ->>, используя ее в качестве входных данных для CONCAT, чтобы добавить '!', а также встроить ее обратно в правильный синтаксис для преобразования обратно в jsonb строку. Здесь идет гораздо больше работы, чем кажется необходимым, просто для добавления строки к заданному пути.

Есть ли более простой способ сделать это? Встроенный функция или оператор, возможно, или более простой способ добавления, чем использование CONCAT? (Я пытался использовать оператор || различными способами, но, похоже, не смог заставить что-либо работать с синтаксисом и типами)

1 Ответ

1 голос
/ 22 февраля 2020

Я не думаю, что есть лучший способ, чем jsonb_set().

Конкат может быть заменен на || следующим образом:

jsonb_set(foo, '{1}', ('"' || (foo->>1) || '!"')::jsonb)
...