PostgreSQL
 sql >> база данни >  >> RDS >> PostgreSQL

Как да извършвате операции за актуализиране на колони от тип JSONB в Postgres 9.4

Ако можете да надстроите до Postgresql 9.5, jsonb_set командата е налична, както споменаха други.

Във всеки от следните SQL изрази съм пропуснал where клауза за краткост; очевидно бихте искали да добавите това обратно.

Име на актуализацията:

UPDATE test SET data = jsonb_set(data, '{name}', '"my-other-name"');

Сменете етикетите (за разлика от добавянето или премахването на етикети):

UPDATE test SET data = jsonb_set(data, '{tags}', '["tag3", "tag4"]');

Замяна на втория маркер (индексиран с 0):

UPDATE test SET data = jsonb_set(data, '{tags,1}', '"tag5"');

Добавете маркер (това ще работи, стига да има по-малко от 999 маркера; промяната на аргумент 999 на 1000 или по-висок генерира грешка . Това вече не изглежда така в Postgres 9.5.3; може да се използва много по-голям индекс):

UPDATE test SET data = jsonb_set(data, '{tags,999999999}', '"tag6"', true);

Премахнете последния маркер:

UPDATE test SET data = data #- '{tags,-1}'

Сложна актуализация (изтриване на последния етикет, вмъкване на нов таг и промяна на името):

UPDATE test SET data = jsonb_set(
    jsonb_set(data #- '{tags,-1}', '{tags,999999999}', '"tag3"', true), 
    '{name}', '"my-other-name"');

Важно е да се отбележи, че във всеки от тези примери всъщност не актуализирате нито едно поле от JSON данните. Вместо това създавате временна модифицирана версия на данните и присвоявате тази модифицирана версия обратно към колоната. На практика резултатът трябва да е същият, но като се има предвид това, трябва да направи сложните актуализации, като последния пример, по-разбираеми.

В сложния пример има три трансформации и три временни версии:Първо, последният маркер се премахва. След това тази версия се трансформира чрез добавяне на нов етикет. След това втората версия се трансформира чрез промяна на name поле. Стойността в data колоната се заменя с окончателната версия.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Как мога да задам параметър String[] на собствена заявка?

  2. Как да мигрираме съществуваща Postgres таблица към разделена таблица възможно най-прозрачно?

  3. Да се ​​използва ли имейл адресът като основен ключ?

  4. Къде PostgreSQL съхранява конфигурационни/conf файлове?

  5. alembic util грешка в командата не може да намери идентификатор