Postgresql, jsonb с несколькими ключами возвращает одну строку для каждого ключа - PullRequest
0 голосов
/ 05 октября 2018

Вот какова моя ситуация.У меня есть строки, в которых есть столбец json, и я пытался получить все значения для всех ключей в этом json только в одну строку.

скажем, если у меня есть строка с jsonзначение:

{"key1": "a", "key2": "b"}

Теперь можно ли извлечь значения следующим образом: ["a", "b"]?

Я пытался сделать это до сих пор:

select ---- some sum() fields ----,
b.match_data::json -> jsonb_object_keys(b.match_data) as "Course"
from --- tables ---
join -- tables ---
where -- condition ---
group by -- sum() fields ----, b.match_data

Проблемаэто означает, что для json с несколькими ключами возвращается несколько строк.

Ответы [ 2 ]

0 голосов
/ 20 октября 2018

Ответ S-Man дал мне указание использовать агрегаторы, и после нескольких проб и ошибок я получил свой ответ

(select string_agg((select value from jsonb_array_elements_text(value)), ',')
from jsonb_each(b.match_data)) "Course"

Он собирает и отображает значения в виде a, b,... в одной строке.

0 голосов
/ 05 октября 2018

demo: db <> fiddle

WITH jsondata AS (
    SELECT '{"key1": "a", "key2": "b"}'::jsonb as data  -- A
)
SELECT jsonb_agg(value)                                 -- C
FROM jsondata, jsonb_each(data)                         -- B

Postgres JSON-функции , Postgres (JSON) агрегатные функции

A: CTE для работы с вашими данными

B: jsonb_each расширяет ваши данные;результат:

key    value
key1   "a"
key2   "b"

C: jsonb_agg объединяет столбец value в массив json с ожидаемым результатом: ["a", "b"].


Если вы не хотите, чтобырезультат в виде массива json, но в качестве обычного текстового массива вы должны изменить jsonb_each на jsonb_each_text и jsonb_agg на array_agg (см. справку)


Я использовал jsonb в качестве типа.Конечно, все функции существуют и для типа json.( Типы Postgres JSON )

...