Обновить значение ключа в массиве jsonb объектов - PullRequest
0 голосов
/ 06 июня 2018

У меня есть следующая таблица company со столбцом jsonb с именем log: -

|code | log
-----------------------------------------------------------------------------
|K50  | [{"date": "2002-02-06", "type": "Chg Name", "oldvalue": "TEH   "},
         {"date": "2003-08-26", "type": "Chg Name", "oldvalue": "TEOA   "}]
|C44  | [{"date": "2003-05-07", "type": "Chg Name", "oldvalue": "CDE   "}]

Как обрезать конечные пробелы в oldvalue?

Ответы [ 2 ]

0 голосов
/ 06 июня 2018

Вы можете сделать это с помощью комбинации jsonb функций и операторов :

UPDATE company c
SET    log = sub.log2
FROM  (
   SELECT *
   FROM   company c
   CROSS  JOIN LATERAL (
      SELECT jsonb_agg(jsonb_set(l, '{oldvalue}', to_jsonb(rtrim(l->>'oldvalue')))) AS log2
      FROM   jsonb_array_elements(c.log) l
      ) sub
   WHERE  jsonb_typeof(log) = 'array'  -- exclude NULL and non-arrays
   ) sub
WHERE  c.code =  sub.code   -- assuming code is unique
AND    c.log  <> sub.log2;  -- only where column actually changed.

SQL Fiddle.

0 голосов
/ 06 июня 2018

В PostgreSQL тип данных jsonb используется для хранения json как полученного. Если вы хотите обновить какое-либо значение внутри него, вам необходимо преобразовать данные из своего кода, прежде чем его можно будет сохранить в БД. Это хорошийПрактика. В этом сценарии конечные пробелы следует беречь из самого кода. Если вы хотите обновить явно, это также возможно.

PFB-ссылка для этого.

Как выполнить обновлениеоперации над столбцами типа JSONB в Postgres 9.4

...