PostgreSQL: синтаксис для запроса вложенного массива json

#json #postgresql

#json #postgresql

Вопрос:

Недавно я обнаружил, что PostgreSQL можно использовать для хранения JSON
, прежде чем импортировать множество данных, мне нужно понять, как их получить, в частности, вложенные объекты

Это руководство по postgresql является хорошей отправной точкой, но на самом деле не объясняет, как запрашивать вложенный массив json

В приведенном ниже примере мне нужно выбрать codes -> code, где codes -> level: 1 (adminCode1_iso) относится к adminName1 и, если он существует, codes -> level: 2 относится к adminName2

     CREATE TABLE gn_json (
   id serial NOT NULL PRIMARY KEY,
   info json NOT NULL
);
comment on table gn_json is 'How PG holds json';
insert into gn_json (info)
VALUES ('{
"adminCode2": "C3",
"codes": [
{
"code": "ENG",
"level": "1",
"type": "ISO3166-2"
},
{
"code": "CAM",
"level": "2",
"type": "ISO3166-2"
}
],
"adminCode3": "12UE",
"adminName4": "Yelling",
"adminName3": "Huntingdonshire",
"adminCode1": "ENG",
"adminName2": "Cambridgeshire",
"distance": 0,
"countryCode": "GB",
"countryName": "United Kingdom",
"adminName1": "England",
"adminCode4": "12UE085"
}',
'{
"codes": [
{
"code": "81",
"level": "1",
"type": "ISO3166-2"
}
],
"adminCode1": "63",
"distance": 0,
"countryCode": "TH",
"countryName": "Thailand",
"adminName1": "Krabi"
}');


select info ->> 'countryName' as countryName,info ->> 'countryCode' as countryCode,
info ->> 'adminName1' as adminName1, info ->> 'adminCode1' as adminCode1,
info ->> 'adminName2' as adminName2, info ->> 'adminCode2' as adminCode2,
info ->'codes->0->' -> 'code' as adminCode1_iso,
info ->'codes->1->' -> 'code' as adminCode2_iso
FROM gn_json;  
  

Редактировать ожидаемый результат

 countryname countrycode adminname1  admincode1  adminname2  admincode2  admincode1_iso  admincode2_iso
United Kingdom  GB  England ENG Cambridgeshire  C3  ENG CAM
Thailand    TH  Krabi   63  NULL    NULL    81  NULL
  

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

1. Не связано, но: рекомендуется использовать jsonb в течение json этих дней.

2. Пожалуйста, покажите нам результат, который вы хотите.

3. Если вы используете PG12 , вы могли бы изучить возможность использования jsonpath

4. Привет, я отредактировал ожидаемый результат

5. @a_horse_with_no_name можете ли вы показать мне синтаксис для jsonb? @Marth Да, я использую PG12 info ->> '$.codes[0].code' as adminCode1_iso = null