Извлечение массива 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