PostgreSQL — разбор вложенного аргумента JSON

#json #postgresql

#json #postgresql

Вопрос:

Я довольно новичок в своем опыте работы с Postgres, поэтому я надеюсь, что это не слишком исправимо 🙂

Если вложенный JSON передается как переменная в PostgreSQL, можно ли его проанализировать без предварительного сброса во временную таблицу?

Допустим, я хотел получить имена материнской платы из примера ниже. Как будет выглядеть оператор SELECT?

 do
$$
declare persons json = 
'{
        "name":"Sally",
        "spouse":
        {
            "name":"Alex",
            "parents":
            {
                "father":"Rafael",
                "mother":"Ofelia"
            },
            "phones":
            [
                {
                    "type":"work",
                    "number":"619-555-1212"
                },
                {
                    "type":"cell",
                    "number":"012-345-6789"
                }
            ]
        }
    }';

begin
    
/* ??? */

end;
$$
  

Заранее большое спасибо,
Мэтт

Ответ №1:

Его можно разобрать, но вопрос в том, что вы будете делать с ответом?

Если вы просто хотите увидеть его в результатах, то быстрее всего определить свой json в CTE:

 with p as (
 select '{
        "name":"Sally",
        "spouse":
        {
            "name":"Alex",
            "parents":
            {
                "father":"Rafael",
                "mother":"Ofelia"
            },
            "phones":
            [
                {
                    "type":"work",
                    "number":"619-555-1212"
                },
                {
                    "type":"cell",
                    "number":"012-345-6789"
                }
            ]
        }
    }'::jsonb as persons
)
select persons->'spouse'->'parents'->>'mother'
  from p;

 ?column? 
----------
 Ofelia
(1 row)

  

Комментарии:

1. Эй, Майк, CTS — это именно то, что мне было нужно! Я собираюсь завершить вставку проанализированного JSON в таблицу. Ранее мы помещали JSON во временную таблицу, а затем обрабатывали ее, но я слышал, что временная таблица не нужна. Я просто пытался понять, как управлять синтаксическим анализом JSON без таблицы, на которую можно опереться, что, конечно, CTE отлично справляется. Спасибо миллион!

2. В качестве альтернативы, select persons#>>'{spouse,parents,mother}' from p;