Это может быть тривиально [или нет].
Если вам известны все метки из метаданных (возможно, из-за того, что вы их извлекли ранее), вы можете использовать функцию сводной таблицы postgresql:
Сначала вам нужно включить функцию:
CREATE extension tablefunc;
тогда вы можете использовать кросс-таблицу следующим образом:
SELECT * FROM crosstab ('
SELECT t.id as id, m->>''label'', m->>''value''
FROM import.manifest t,
LATERAL jsonb_array_elements(t.data->''metadata'') m
ORDER BY 1,2
', '
select distinct m->>''label''
FROM import.manifest t,
LATERAL jsonb_array_elements(t.data->''metadata'') m
order by 1
') AS ct (id int,Author text, Contributors text, Creator text, "Date Statement" text, Homepage text, Published text);
Вы должны поместить всю свою метку в запрос, поэтому она не так тривиальна.
Функция кросс-таблицы принимает 2 параметра:
- Первый - это SQL, который возвращает 3 столбца:
- Один столбец идентификатора для объединения данных
- ключевой столбец. Текст из этого столбца будет именем столбца в результате
- столбец значений
- Второй - это SQL, который возвращает все столбцы, которые у вас будут.
С помощью функции вам также нужно определить результат, который вы получите. Это означает, что as ct(....)
является обязательным.
он должен ссылаться на столбец идентификатора и весь столбец, который вы будете иметь для возврата. для вашего случая использования это возврат:
select distinct(m->>'label')
FROM manifest t, LATERAL jsonb_array_elements(t.data->'metadata') m
order by 1