Я использую PostgreSQL 9.5. У меня есть таблица с массивами JSON, которые содержат JSON-объекты в следующем формате:
[]
[{animal:cat}, {plant:sunflower}, {car:mercedes}]
[{animal:dog}]
[{animal:dog}, {car:audi}]
[]
Мне нужно вывести таблицу, которая объединяет значения animal и plant , а затем вычисляет сумму каждой комбинации значений ключа. Нулевые значения следует игнорировать, но ситуации, в которых есть только animal или plant , также группируются как их собственная группа. автомобиль должен быть полностью удален.
Мой идеальный конечный результат похож на это:
Animal : Plant | Amount
---------------------------
cat : oak | 54
cat : sunflower | 127
dog | 8
cow : oak | 3
...
Что я пытался:
SELECT
((json_array_elements(Table.json_array)::JSONB
- 'car')::JSON#>>'{animal}')::TEXT AS elems,
count(*)
FROM Table
GROUP BY elems
Я вижу, что это дает мне animal в виде строки и считает каждый ее экземпляр. Я также могу удалить car , приведя массив JSON к JSONB, затем удалить car с оператором минус и вернуть обратно в JSON. Однако приведение к JSONB меняет порядок моих значений.
Но когда я пытаюсь объединить строку из animal и plant :
SELECT
(((json_array_elements(Table.json_array))::JSON#>>'{animal}') || ' : ' || ((json_array_elements(Table.json_array))::JSON#>>'{plant}'))
::TEXT AS elems,
count(*)
FROM Table
GROUP BY elems
Я получаю сообщение об ошибке:
функции и операторы могут принимать не более одного установленного аргумента
Пробовал json_agg
, CONCAT()
и ||
, тот же результат.
Я пытался выяснить, как разыграть сторону животное или растение как нечто иное, чем сет, но пока не удалось продвинуться.
Как получить желаемый результат? Я ограничен использованием только команд Postgres, так как я работаю с базой данных через Apache superset, программу визуализации данных.