#json #postgresql
Вопрос:
В базе данных (postgres 10), с которой я работаю, на данный момент у меня много столбцов со строками формата json (текстовые поля)
Мне трудно искать,фильтровать и объединять значения внутри этих строк.
Я создал пример в fiddle и надеюсь, что кто-нибудь поможет мне его решить.
https://dbfiddle.uk/?rdbms=postgres_13amp;fiddle=d003c1cea832e35696260b10c6b4c047
Вот две мои проблемы, которые я нашел сложными.
- В поле объект таблицы -> конфигурация у меня есть поле «date_kg_later». Это может быть [] или провести больше дат. В моем выборе я хочу получить самую высокую дату, если она не пуста.
- В таблице объект -> 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 🙁