Postgresql получает ключи из вложенного массива объектов в поле JSONB - PullRequest
0 голосов
/ 08 мая 2019

Здесь 'фиктивные данные для столбца jsonb

{
"address": [
{
  "country": "US",
  "extension": [
    {
      "extension": [
        {
          "valueDecimal": -71.024638,
          "url": "latitude"
        },
        {
          "url": "longitude",
          "valueDecimal": 42.082543
        }
      ],
      "url": "url1"
    }
  ],
  "postalCode": "02301",
  "city": "Brockton"
},
{
  "country": "US",
  "extension": [
    {
      "extension": [
        {
          "valueDecimal": -71.024638,
          "url": "latitude"
        },
        {
          "url": "longitude",
          "valueDecimal": 42.082543
        }
      ],
      "url": "url2"
    }
  ],
  "postalCode": "02301",
  "city": "Brockton"
}
]
}

Я хочу получить что-то вроде address->'extension'->'extension'->'valueDecimal', но оно работает только с json, но это массив данных JSON ... мой ожидаемый вывод -

[-71.024638, -71.024638]

Я могу получить первое расширение (т. Е. Первый массив JSON) с помощью приведенного ниже запроса

SELECT elems.value  FROM "patient", jsonb_array_elements(resource -> 'extension') AS elems;

поэтому проблема в том, что я не могу получить внутренние данные «расширения» (внутри объекта расширения). Любая помощь будет полезна.

1 Ответ

1 голос
/ 08 мая 2019

Вы можете соединить несколько уровней jsonb_array_elements

SELECT json_agg(elems3->>'valueDecimal') as latitudes
    FROM patient
 cross join jsonb_array_elements(resource ->'address'  ) AS elems
 cross join jsonb_array_elements(elems ->'extension')  AS elems2
 cross join jsonb_array_elements(elems2 ->'extension') AS elems3
 where elems3->>'url' = 'latitude'

ДЕМО

Это может быть медленнее для больших записей, хотя есть способы улучшить производительность. Рекомендуемый вариант - изменить структуру таблицы и нормализовать ее, чтобы хранить значения отдельно в виде столбцов в соответствующих таблицах и использовать JSON только в тех случаях, когда нет другого способа обработки данных.

...