В 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
? (Я пытался использовать оператор ||
различными способами, но, похоже, не смог заставить что-либо работать с синтаксисом и типами)