postgresql-连接2个json记录(来自2个不同的select语句)

时间:2019-03-16 21:51:50

标签: arrays json postgresql

我想将2个json串联起来:json1,json2。

每个json是select语句的结果。

选择1(json1):

select to_json(PROFITCENTERID) as table1
from (  
    select
        'PROFITCENTERID' as name,
        17 as type,
        '' as value,
        jsonb_build_array(
            jsonb_build_object('name', 'PRCTR_NAME', 'value', PRCTR_NAME, 'type', 0, 'children', '[]'::jsonb),
            jsonb_build_object('name', 'LONG_TEXT', 'value', LONG_TEXT, 'type', 0, 'children', '[]'::jsonb)
        ) as children
    from (
select 'TESTCOSTIN' as PRCTR_NAME, 'TESTCOSTIN' as LONG_TEXT, 'ALICE' as IN_CHARGE, '11' as PRCTR_HIER_GRP,
'1000_A' as SEGMENT, 'E' as LANGU, 'E' as LANGU2,  'DE02' as CO_AREA, '0000001118' as PROFIT_CTR, '19901010' as VALIDFROM, '20201010' AS VALIDTO
UNION ALL
select 'TESTLUCIAN' as PRCTR_NAME, 'TESTLUCIAN' as LONG_TEXT, 'ALICE' as IN_CHARGE, '11' as PRCTR_HIER_GRP,
'1000_A' as SEGMENT, 'E' as LANGU, 'E' as LANGU2,  'DE02' as CO_AREA, '0000001119' as PROFIT_CTR, '19901010' as VALIDFROM, '20201010' AS VALIDTO
) c
) PROFITCENTERID

选择2(json2):

select to_json(SALES) as table2
from (  
    select
        'PROFITCENTERID' as name,
        17 as type,
        '' as value,
        jsonb_build_array(
            jsonb_build_object('name', 'PROFIT_CTR', 'value', PROFIT_CTR, 'type', 0, 'children', '[]'::jsonb),
            jsonb_build_object('name', 'PRCTR_HIER_GRP', 'value', PRCTR_HIER_GRP, 'type', 0, 'children', '[]'::jsonb)
        ) as children
    from (
select 'TESTCOSTIN' as PRCTR_NAME, 'TESTCOSTIN' as LONG_TEXT, 'ALICE' as IN_CHARGE, '11' as PRCTR_HIER_GRP,
'1000_A' as SEGMENT, 'E' as LANGU, 'E' as LANGU2,  'DE02' as CO_AREA, '0000001118' as PROFIT_CTR, '19901010' as VALIDFROM, '20201010' AS VALIDTO
UNION ALL
select 'TESTLUCIAN' as PRCTR_NAME, 'TESTLUCIAN' as LONG_TEXT, 'ALICE' as IN_CHARGE, '11' as PRCTR_HIER_GRP,
'1000_A' as SEGMENT, 'E' as LANGU, 'E' as LANGU2,  'DE02' as CO_AREA, '0000001119' as PROFIT_CTR, '19901010' as VALIDFROM, '20201010' AS VALIDTO
) c
) SALES

有没有办法做到这一点,因为不能加入他们?

我尝试使用||但是我收到错误消息“由子查询返回的多于一行用作表达式”

谢谢!

1 个答案:

答案 0 :(得分:0)

如果首先聚合JSON以创建字符串,则可以将它们串联起来。由于连接的字符串虽然不是有效的JSON,所以我不确定为什么要这样做,而您可能想看一下array_agg。

select (
    select string_agg(to_json(SALES)::text, '') as table2
    from (  
        select
            'PROFITCENTERID' as name,
            17 as type,
            '' as value,
            jsonb_build_array(
                jsonb_build_object('name', 'PROFIT_CTR', 'value', PROFIT_CTR, 'type', 0, 'children', '[]'::jsonb),
                jsonb_build_object('name', 'PRCTR_HIER_GRP', 'value', PRCTR_HIER_GRP, 'type', 0, 'children', '[]'::jsonb)
            ) as children
        from (
    select 'TESTCOSTIN' as PRCTR_NAME, 'TESTCOSTIN' as LONG_TEXT, 'ALICE' as IN_CHARGE, '11' as PRCTR_HIER_GRP,
    '1000_A' as SEGMENT, 'E' as LANGU, 'E' as LANGU2,  'DE02' as CO_AREA, '0000001118' as PROFIT_CTR, '19901010' as VALIDFROM, '20201010' AS VALIDTO
    UNION ALL
    select 'TESTLUCIAN' as PRCTR_NAME, 'TESTLUCIAN' as LONG_TEXT, 'ALICE' as IN_CHARGE, '11' as PRCTR_HIER_GRP,
    '1000_A' as SEGMENT, 'E' as LANGU, 'E' as LANGU2,  'DE02' as CO_AREA, '0000001119' as PROFIT_CTR, '19901010' as VALIDFROM, '20201010' AS VALIDTO
    ) c
    ) SALES
) || (
    select string_agg(to_json(SALES)::text, '') as table2
    from (  
        select
            'PROFITCENTERID' as name,
            17 as type,
            '' as value,
            jsonb_build_array(
                jsonb_build_object('name', 'PROFIT_CTR', 'value', PROFIT_CTR, 'type', 0, 'children', '[]'::jsonb),
                jsonb_build_object('name', 'PRCTR_HIER_GRP', 'value', PRCTR_HIER_GRP, 'type', 0, 'children', '[]'::jsonb)
            ) as children
        from (
    select 'TESTCOSTIN' as PRCTR_NAME, 'TESTCOSTIN' as LONG_TEXT, 'ALICE' as IN_CHARGE, '11' as PRCTR_HIER_GRP,
    '1000_A' as SEGMENT, 'E' as LANGU, 'E' as LANGU2,  'DE02' as CO_AREA, '0000001118' as PROFIT_CTR, '19901010' as VALIDFROM, '20201010' AS VALIDTO
    UNION ALL
    select 'TESTLUCIAN' as PRCTR_NAME, 'TESTLUCIAN' as LONG_TEXT, 'ALICE' as IN_CHARGE, '11' as PRCTR_HIER_GRP,
    '1000_A' as SEGMENT, 'E' as LANGU, 'E' as LANGU2,  'DE02' as CO_AREA, '0000001119' as PROFIT_CTR, '19901010' as VALIDFROM, '20201010' AS VALIDTO
    ) c
    ) SALES
);
相关问题