PostgreSQL
 sql >> база данни >  >> RDS >> PostgreSQL

Създайте вложен json от sql заявка postgres 9.4

Трябва да създадете йерархична заявка, за да получите йерархична структура като резултат.

Искате да имате много хора в един json обект, така че използвайте json_agg() за събиране на лица в json масив. Аналогично, човек може да има няколко коли и трябва да поставите автомобили, принадлежащи на един човек, в json масив. Същото важи и за колите и колелата.

select
    json_build_object(
        'persons', json_agg(
            json_build_object(
                'person_name', p.name,
                'cars', cars
            )
        )
    ) persons
from person p
left join (
    select 
        personid,
        json_agg(
            json_build_object(
                'carid', c.id,    
                'type', c.type,
                'comment', 'nice car', -- this is constant
                'wheels', wheels
                )
            ) cars
    from
        car c
        left join (
            select 
                carid, 
                json_agg(
                    json_build_object(
                        'which', w.whichone,
                        'serial number', w.serialnumber
                    )
                ) wheels
            from wheel w
            group by 1
        ) w on c.id = w.carid
    group by personid
) c on p.id = c.personid;

(Форматираният) резултат:

{
    "persons": [
        {
            "person_name": "Johny",
            "cars": [
                {
                    "carid": 1,
                    "type": "Toyota",
                    "comment": "nice car",
                    "wheels": [
                        {
                            "which": "front",
                            "serial number": 11
                        },
                        {
                            "which": "back",
                            "serial number": 12
                        }
                    ]
                },
                {
                    "carid": 2,
                    "type": "Fiat",
                    "comment": "nice car",
                    "wheels": [
                        {
                            "which": "front",
                            "serial number": 21
                        },
                        {
                            "which": "back",
                            "serial number": 22
                        }
                    ]
                }
            ]
        },
        {
            "person_name": "Freddy",
            "cars": [
                {
                    "carid": 3,
                    "type": "Opel",
                    "comment": "nice car",
                    "wheels": [
                        {
                            "which": "front",
                            "serial number": 3
                        }
                    ]
                }
            ]
        }
    ]
}

Ако не сте запознати с вложените производни таблици, можете да използвате общи изрази на таблици. Този вариант илюстрира, че заявката трябва да бъде изградена, като се започне от най-вложения обект към най-високото ниво:

with wheels as (
    select 
        carid, 
        json_agg(
            json_build_object(
                'which', w.whichone,
                'serial number', w.serialnumber
            )
        ) wheels
    from wheel w
    group by 1
),
cars as (
    select 
        personid,
        json_agg(
            json_build_object(
                'carid', c.id,    
                'type', c.type,
                'comment', 'nice car', -- this is constant
                'wheels', wheels
                )
            ) cars
    from car c
    left join wheels w on c.id = w.carid
    group by c.personid
)
select
    json_build_object(
        'persons', json_agg(
            json_build_object(
                'person_name', p.name,
                'cars', cars
            )
        )
    ) persons
from person p
left join cars c on p.id = c.personid;


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. PostgreSQL - прави първия ред да се показва като сбор от останалите редове

  2. Кои специфични изключения представляват неуспешна сериализация, когато Django използва ниво на изолация на сериализуема транзакция с postgresql?

  3. Намерете разликата между времевите марки в секунди в PostgreSQL с помощта на JOOQ

  4. Python + PostgreSQL + странен ascii =UTF8 грешка при кодиране

  5. Rails игнорира константите в оператора SQL SELECT