Извлечение массива json из таблицы postgres дает ошибку: не удается извлечь элементы из скаляра
С помощью jsonb_array_elements()
функция для извлечения из jsonb
массив данных из Postgres, он выдал ошибку:
не удается извлечь элементы из скаляра
Я предполагаю, что это из-за NULL
в ответном вызове добавлено NULL
проверка состояния, но не работает. Любая помощь приветствуется.
select id ,
CASE
WHEN report IS NULL OR
(report->'stats_by_date') IS NULL OR
(report->'stats_by_date'-> 'date') IS NULL then to_json(0)::jsonb
ELSE jsonb_array_elements(report -> 'stats_by_date' -> 'date')
END AS Date
from factor_reports_table
усеченный массив json выглядит так:
"stats_by_date": {"дата": [16632, 16633, 16634, ...], "imps": [2418, 896, 1005...], ...}
1 ответов
в ваших данных должно быть некоторое скалярное значение вместо массива внутри date
ключ.
вы можете определить, какой тип является определенным ключом с jsonb_typeof()
а затем оберните его внутри CASE
заявление.
рассмотрим ниже пример скаляра и массива в качестве входного набора:
select
case when jsonb_typeof(jsonb_column->'stats_by_date'->'date') = 'array'
then jsonb_array_elements(jsonb_column->'stats_by_date'->'date')
else jsonb_column->'stats_by_date'->'date'
end as date
from (
select '{"stats_by_date": {"date": 123}}'::jsonb -- scalar (type: 'number')
union all
select '{"stats_by_date": {"date": [456]}}'::jsonb -- array (type: 'array')
) foo(jsonb_column);
результат
date
------
123
456
поэтому ваш запрос должен быть написан так, чтобы обрабатывать такие случаи:
select id,
case when jsonb_typeof(jsonb_column->'stats_by_date'->'date') = 'array'
then jsonb_array_elements(jsonb_column->'stats_by_date'->'date')
else jsonb_column->'stats_by_date'->'date'
end as date
from factor_reports_table