有没有一种方法可以将JSON对象数组与其他视图/表中的另一个JSON对象数组合并?

时间:2019-08-28 22:52:14

标签: sql postgresql

所以我想按年龄将这2个表分组在一起,以便到目前为止我可以从两个表中找到该年龄组的总人数,但是我想要JSON数据错误

这是我的方法:

SELECT temp.age, sum(temp.total), json_agg(temp.data_recs) as data_recs FROM (

        SELECT  
            '31-40' as age, COUNT(*) as total, 
            json_agg(
                  CASE
                  WHEN table_1.age BETWEEN 31 AND 40 
                  THEN json_build_object(
               'country', table_1.country,
               'Name', table_1.name
            )
            ELSE json_build_object(
                  'country', '',
                  'Name', ''
                )
                END
                  ) AS data_recs 
            from table_1 
        WHERE table_1.age BETWEEN 31 AND 40

        UNION ALL

        SELECT  
            '31-40' as age, COUNT(*) as total, 
            json_agg(
                  CASE
                  WHEN table_2.age BETWEEN 31 AND 40
                  THEN json_build_object(
               'country', table_2.country,
               'Name', table_2.name
            )
            ELSE json_build_object(
                  'country', '',
                  'Name', ''
                )
                END
                  ) AS data_recs 
            from table_2 
        WHERE table_2.age BETWEEN 31 AND 40

  ) AS temp group by temp.age 

第1个表格的结果,例如

  age  |  total |  data_recs
'31-40'|   2    | [{"name":"John","country":"USA"},{"name":"Eddy","country":"USA"}]

第2个表格的结果,例如

  age  |   total |  data_recs
'31-40'|   2     | [{"name":"Cienna","country":"Italy"},{"name":"Rosie","country":"Italy"}]

到目前为止,我能够实现

  age  |   total |  data_recs
'31-40'|   4     | [[{"name":"John","country":"USA"},{"name":"Eddy","country":"USA"}],[{"name":"Cienna","country":"Italy"},{"name":"Rosie","country":"Italy"}]]

JSON数组1 = [{"name":"John","country":"USA"},{"name":"Eddy","country":"USA"}]

JSON数组2 = [{"name":"Cienna","country":"Italy"},{"name":"Rosie","country":"Italy"}]

我想要的是:-

     age  |   total |  data_recs
  '31-40' |   4     | [{"name":"John","country":"USA"},{"name":"Eddy","country":"USA"},{"name":"Cienna","country":"Italy"},{"name":"Rosie","country":"Italy"}]

我想要的组合JSON应该是这样的:

[{"name":"John","country":"USA"},{"name":"Eddy","country":"USA"},{"name":"Cienna","country":"Italy"},{"name":"Rosie","country":"Italy"}]

有没有办法做到这一点或其他方法?

1 个答案:

答案 0 :(得分:1)

基本上,您的代码如下

SELECT
    json_agg(json_objects from UNION)
FROM (
    SELECT
        json_agg(
            json_build_object()
        )
    FROM
        ...

    UNION

    SELECT
        json_agg(
            json_build_object()
        )
    FROM
        ...
)

因此,首先要创建数组,然后再聚合数组。但是,如果您省略了最初的json_agg()步骤,那么高级json_agg()将聚合您正在使用json_object_build()创建的JSON对象。

因此,只有一种聚合才是您的解决方案:

SELECT
    json_agg(json_arrays from UNION)
FROM (
    SELECT
        json_build_object()
    FROM
        ...

    UNION

    SELECT
        json_build_object()
    FROM
        ...
)