json_agg () с псевдорядом - PullRequest
       13

json_agg () с псевдорядом

0 голосов
/ 15 декабря 2018
CREATE TABLE content
(
    code          INTEGER NOT NULL
  , nameid        TEXT    NOT NULL
)

INSERT INTO content(code, nameid) VALUES
  ( 0, 'Support')
, ( 1, 'Adrenaline')
, ( 2, 'Aquapark')
;

Нужно выбрать все содержимое в виде массива-объекта JSON с именем 'content' с псевдорядом с code = '' и nameid = 'All'

Что я сделал:
1) Простой выбор

SELECT 
   json_build_object('content', (SELECT json_agg(json_build_object(
    'code',   s.code::TEXT
  , 'nameid', s.nameid::TEXT
  ))
  FROM content s
  )
);

Результат

{
    "content": [{
            "code": "0",
            "nameid": "Support"
        },
        {
            "code": "1",
            "nameid": "Adrenaline"
        },
        {
            "code": "2",
            "nameid": "Aquapark"
        }
    ]
}

Все хорошо, но как добавить псевдоряд?
2) Лучше всего я смог

SELECT  
  json_build_object('content', json_build_array(
    json_build_object(
      'code',   ''
    , 'nameid', 'All'::TEXT),    
    (SELECT json_agg(json_build_object(
      'code',   s.code::TEXT
    , 'nameid', s.nameid::TEXT
  ))
  FROM content s
  ))
);

Результат

{
    "content": [{
            "code": "",
            "nameid": "All"
        },
        [{
                "code": "0",
                "nameid": "Support"
            },
            {
                "code": "1",
                "nameid": "Adrenaline"
            },
            {
                "code": "2",
                "nameid": "Aquapark"
            }
        ]
    ]
}

И у нас есть массив в массиве, как в sql, так и в json, но я не могу понять, как объединить json_agg с псевдорядом.

1 Ответ

0 голосов
/ 15 декабря 2018

Используйте to_json() и union all:

select jsonb_build_object('content', json_agg(to_json))
from (
    select to_json(c)
    from (select '' as code, 'All' as nameid) c
    union all
    select to_json(c)
    from content c
    ) s

Вывод:

 {
    "content": [
        {
            "code": "",
            "nameid": "All"
        },
        {
            "code": 0,
            "nameid": "Support"
        },
        {
            "code": 1,
            "nameid": "Adrenaline"
        },
        {
            "code": 2,
            "nameid": "Aquapark"
        }
    ]
 }

Версия с псевдонимом в производной таблице:

select jsonb_build_object('content', json_agg(codes))
from (
    select to_json(c) as codes
    from (select '' as code, 'All' as nameid) c
    union all
    select to_json(c)
    from content c
    ) s
...