Создать JSON из объединенных таблиц - PullRequest
3 голосов
/ 28 октября 2019

Как мне создать JSON (B) из этого оператора:

SELECT *
FROM foo
LEFT JOIN bar
  USING (id)

Мое решение в настоящее время выглядит так:

SELECT to_jsonb(foo) || coalesce(to_jsonb(bar), '{}')
FROM foo
LEFT JOIN bar
  USING (id)

Это становится уродливее для каждой объединенной таблицы, например:

SELECT to_jsonb(foo) || coalesce(to_jsonb(bar), '{}') || coalesce(to_jsonb(baz), '{}')
FROM foo
LEFT JOIN bar
  USING (id)
LEFT JOIN baz
  USING (id)

Я бы хотел что-то вроде этого:

SELECT to_jsonb(*)
FROM foo
LEFT JOIN bar
  USING (id)

Но это дает мне:

[42883] ОШИБКА: функция to_jsonb () делаетне существует

1 Ответ

3 голосов
/ 28 октября 2019

Третий запрос производит декартово произведение всех строк из bar и baz с одинаковыми id. Независимо от того, предназначен ли он, вы можете использовать производную таблицу, перенеся преобразование в JSON во внешний запрос.

select to_jsonb(q)
from (
    select *
    from foo
    left join bar using(id)
    left join baz using(id)
    ) q
...