Расширение массива JSON, встроенного в объект в Postgres 11.7 - PullRequest
1 голос
/ 09 мая 2020

Postgres 11,7. Обновление до PG 12 (JSONPath, я знаю) находится на стадии планирования, не знаю, когда мы туда доберемся.

Я работаю над передачей некоторых данных в сохраненную функцию PL / Pg SQL, и я изо всех сил пытаюсь распаковать массив, встроенный в объект. Я имею дело с некоторыми клиентскими библиотеками, которые действительно любят объект как JSON Root. {[]} вместо [].

В качестве отправной точки вот пример, который работает , когда я получаю массив как элемент верхнего уровня:

-- Note: jsonb instead of json may save reparsing time, if the results are reused.
-- Or so I think I heard.

with expanded_data AS (
 select *
   from jsonb_to_recordset(
          '[
             {"base_text":"Red Large Special","base_id":1},
             {"base_text":"Blue Small","base_id":5},
             {"base_text":"Green Medium Special","base_id":87}
           ]')
      AS unpacked (base_text citext, base_id citext)
 )

select base_text,
       base_id

  from expanded_data

Это возвращает ожидаемые результаты:

base_text           base_id
Red Large Special         1
Blue Small                5
Green Medium Special     87

Этот вариант также отлично работает с массивом верхнего уровня

  with expanded_data AS (
 select *
   from json_populate_recordset(
        null::record,
          '[
             {"base_text":"Red Large Special","base_id":1},
             {"base_text":"Blue Small","base_id":5},
             {"base_text":"Green Medium Special","base_id":87}
           ]')
      AS unpacked (base_text citext, base_id citext)
 )

select base_text,
       base_id

  from expanded_data

Я не смог понять, как получить те же результаты, когда массив JSON встроен как элемент в объект JSON:

{"base_strings":[
 {"base_text":"Red Large Special","base_id":1},
 {"base_text":"Blue Small","base_id":5},
 {"base_text":"Green Medium Special","base_id":87}
]}

Я работал с документами по синтаксису извлечения и различным доступным функциям. ..и еще не разобрались. Может ли кто-нибудь предложить разумную стратегию расширения встроенных элементов массива в набор строк?

1 Ответ

1 голос
/ 09 мая 2020

Это просто:

with expanded_data AS (
 select *
   from jsonb_to_recordset(
          '{"base_strings":[
             {"base_text":"Red Large Special","base_id":1},
             {"base_text":"Blue Small","base_id":5},
             {"base_text":"Green Medium Special","base_id":87}
           ]}'::jsonb -> 'base_strings')                       -- Chages here
      AS unpacked (base_text citext, base_id citext)
 )
select base_text,
       base_id
  from expanded_data;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...