Объединение с полями JSON

#json #postgresql

Вопрос:

В базе данных (postgres 10), с которой я работаю, на данный момент у меня много столбцов со строками формата json (текстовые поля)

Мне трудно искать,фильтровать и объединять значения внутри этих строк.

Я создал пример в fiddle и надеюсь, что кто-нибудь поможет мне его решить.

https://dbfiddle.uk/?rdbms=postgres_13amp;fiddle=d003c1cea832e35696260b10c6b4c047

Вот две мои проблемы, которые я нашел сложными.

  1. В поле объект таблицы -> конфигурация у меня есть поле «date_kg_later». Это может быть [] или провести больше дат. В моем выборе я хочу получить самую высокую дату, если она не пуста.
  2. В таблице объект -> object_type_cd ссылается на значение внутри строки записей в таблице code_table. Здесь я хочу получить название из этой строки обратно.

Моя цель-такой результат:

 id    name        object_type_name    date
1000  Headphones  tech                2022-04-30
1001  Pencil      null                null
 

Ответ №1:

Ваш первый вопрос : если структура json вашего поля конфигурации соответствует приведенному вами примеру, то решением может быть :

До Postgres 12 :

 SELECT Max((c.elt->>'date_from') :: date)
  FROM object
 CROSS JOIN LATERAL json_array_elements(configuration->'date_kg_later') AS c(elt)
 GROUP BY your_object_table_key
 

От и после Postgres 12 :

 SELECT Max(d :: text :: date)
  FROM object
 CROSS JOIN LATERAL jsonb_array_elements((configuration :: jsonb)->'date_kg_later', '$[*].date_from') AS d
 GROUP BY your_object_table_key
 

Ваш второй вопрос мне непонятен, нуждается в дополнительных объяснениях.

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

1. jsonb_path_query не существует в postgres 10.8 🙁