POSTGRESQL извлекает ключи из jsonb

#postgresql #jsonb

Вопрос:

У меня есть таблица со столбцом jsonb, которая содержит много внешних данных, и мне нужно извлечь некоторые ключи, но мне трудно это сделать.

Стол такой:

кодовое название external_data Анализ данных G20540

Внешние данные-это столбец jsonb, организованный с помощью dict внутри массива, и в нем содержатся следующие сведения:

 [
    {
        "DESCR": "Requisito RJ_GRD_GCSOSRJ",
        "ORDERNO": "10",
        "ACAD_PLAN": "",
        "ACAD_PROG": "",
        "DESCR254A": "Requisito RJ_GRD_GCSOSRJ_Plan. de Comunicação I",
        "DESCRSHORT": "Requisito",
        "EFF_STATUS": "A",
        "RQ_CONNECT": "",
        "ACAD_CAREER": "",
        "INSTITUTION": "X",
        "PARENTHESIS": "",
        "SAA_DESCR80": "Requisito RJ_GRD_GCSOSRJ_Plan. de Comunicação I",
        "RQRMNT_GROUP": "000312",
        "ACAD_SUB_PLAN": "",
        "CREATION_DATE": "2020-04-13T21:26:51.923",
        "RQRMNT_USEAGE": "ENR",
        "CONDITION_CODE": "CRS",
        "CONDITION_DATA": "003130",
        "REQUISITE_TYPE": "PRE",
        "CONDITION_DESCR": "ID Curso",
        "RQRMNT_LIST_SEQ": "1",
        "RQ_GRP_LINE_NBR": "0010",
        "RQ_LINE_KEY_NBR": "0001",
        "RQ_GRP_LINE_TYPE": "CRSE",
        "CONDITION_OPERATOR": "EQ"
    }
]
 

Мне нужно извлечь «DESCR», «ORDENO», «DESCR254A», «SAA_DESCR80», «RQRMNT_GROUP», «RQRMNT_USEAGE», «EFF_STATUS».

Я попытался выполнить этот запрос, но получил только нулевые результаты для столбцов external_data:

 SELECT codes.external_id as "code"
    ,codes.title as "title"
    ,requirements.external_data ->> 'RQRMNT_GROUP' as "RQRMNT_GROUP"
    ,requirements.external_data ->> 'EFF_STATUS' as "EFF_STATUS"
    ,requirements.external_data ->> 'RQRMNT_USEAGE' as "RQRMNT_USEAGE"
    ,requirements.external_data ->> 'DESCR' as "DESCR"
    ,requirements.external_data ->> 'SAA_DESCR80' as "SAA_DESCR80"
    ,requirements.external_data ->> 'DESCR254A' as "DESCR254A"
    ,requirements.external_data ->> 'ORDERNO' as "ORDERNO"
FROM requirements
LEFT JOIN codes ON codes.id = requirements.code_id
 

Как я могу это сделать?

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

1. Ваше значение JSON представляет собой массив. Вам нужно использовать -> 0 ->> 'RQRMNT_GROUP' для доступа к первому элементу массива. Что вы хотите в результате, если массив содержит более одного элемента

2. Спасибо! Это сработало!

Ответ №1:

Вам нужно будет использовать WITH предложение для идентификации таблицы в массиве и выбрать из нее:

 WITH external_codes AS (
   SELECT r.code_id,
          jsonb_array_elements(r.external_data) AS external_data
   FROM requirements r
)
SELECT codes.external_id as "code"
    ,codes.title as "title"
    ,external_codes.external_data ->> 'RQRMNT_GROUP' as "RQRMNT_GROUP"
    ,external_codes.external_data ->> 'EFF_STATUS' as "EFF_STATUS"
    ,external_codes.external_data ->> 'RQRMNT_USEAGE' as "RQRMNT_USEAGE"
    ,external_codes.external_data ->> 'DESCR' as "DESCR"
    ,external_codes.external_data ->> 'SAA_DESCR80' as "SAA_DESCR80"
    ,external_codes.external_data ->> 'DESCR254A' as "DESCR254A"
    ,external_codes.external_data ->> 'ORDERNO' as "ORDERNO"
FROM external_codes
LEFT JOIN codes ON codes.id = external_codes.code_id