代码之家  ›  专栏  ›  技术社区  ›  spitfiredd

postgressql:在单个表上构建嵌套的json结构?

  •  1
  • spitfiredd  · 技术社区  · 6 年前

    我试图从一个表构建一个嵌套的Json结构。

    我试图让最终结果看起来像:

    [
        {
            "contract_number":"GS00F0XXX",
            'category': [
                {
                    'cat_id': "874 1",
                    'socio': {
                        "eighta":false,
                        "sdvosb":false,
                        "edwosb":false
                    }   
                },
                {
                    "cat_id":"874 6",
                    'socio': {
                        "eighta":false,
                        "sdvosb":false,
                        "edwosb":false,
                    }
                }
            ]
        },
        {
            'contract_number': "GS00Q14OAXXX",
            'category': [
                {
                    'cat_id': 'OASIS POOL1',
                    'socio': ...
                }
            ]
        }  
    ]
    

    下面的表类似于:

    contract_type   contract_number duns_number eighta  sdvosb  edwosb  category
    MOBIS           GS00F0XXX       5555555     FALSE   FALSE   FALSE   874 1
    MOBIS           GS00F0XXX       5555555     FALSE   FALSE   FALSE   874 6
    MOBIS           GS00F0XXX       5555555     FALSE   FALSE   FALSE   874 7
    OASIS           GS00Q14OAXXX    5555555     FALSE   FALSE   FALSE   OASIS POOL1
    OASIS           GS00Q14OAXXX    5555555     FALSE   FALSE   FALSE   OASIS POOL2
    

    json_agg 调用我得到一个关于嵌套聚合函数的错误。

    select 
        json_build_object(
            'contract_number', contract_number,
            'info', json_agg(
                json_build_object(
                        'category_id', category,
                        'eighta',eighta,
                        'sdvosb',sdvosb,
                        'edwosb',edwosb
                    )
            )
        )
    from contract_vehicle
    group by duns_number, contract_number
    

    SQL Error [42803]: ERROR: aggregate function calls cannot be nested

    select 
        json_build_object(
            'contract_number', contract_number,
            'info', json_agg(
                json_build_object(
                        'category_id', category,
                        'socio', jsonb_agg(
                            json_build_object(
                                'eighta',eighta,
                                'sdvosb',sdvosb,
                                'edwosb',edwosb
                            )
                        )
                    )
            )
        )
    from contract_vehicle
    group by duns_number, contract_number 
    
    1 回复  |  直到 6 年前
        1
  •  0
  •   SABER - FICTIONAL CHARACTER    6 年前

    我不确定这是否有效,但请尝试一下:)

    with cte as (
        select  json_agg(
                            json_build_object(
                                'eighta',eighta,
                                'sdvosb',sdvosb,
                                'edwosb',edwosb
                            )
                        ) a1,duns_number dn, contract_number cn
        from contract_vehicle
        group by duns_number, contract_number)
    select json_build_object(
            'contract_number'::text, contract_number::text,
            'info'::text, json_agg(
                json_build_object(
                        'category_id'::text, category::text,
                        'socio'::text, a1
                    )
            )
        )
    from contract_vehicle inner join cte on (duns_number=dn and contract_number = cn)
    group by duns_number, contract_number;