json PostgreSQL对每个元组返回单个结果集

1l5u6lss  于 2023-01-22  发布在  PostgreSQL
关注(0)|答案(1)|浏览(126)

我有一个表格在下面的格式。
| A类|B|C级|D级|
| - ------|- ------|- ------|- ------|
| 猫|第2类|第三类|第四类|
我需要把这个表转换成一个JSON,就像后面的那个。

{
    {
        "name":"A",     
        "value":"cat",  
        "type" : "String" // need to concat the "type" : "String" to every object
    },
    {
        "name":"B",
        "type":"cat2", 
        "type" : "String"
    },
    {
        "name":"C",
        "type":"cat3", 
        "type" : "String"
    },
    {
        "name":"D",
        "type":"cat4",
        "type" : "String" 
    }
}

所有键都是常量,值是动态的。
是否有任何postgres json函数/查询可以获得此输出?

tp5buhyn

tp5buhyn1#

首先需要将行转换为列,并给出所需的标题,然后可以使用JSON_BUILD_OBJECT构建json记录,JSON_AGG将json集合转换为单个json。

WITH cte AS (
    SELECT 'A' AS "name", A AS "value", 'String' AS "type" FROM tab
    UNION ALL
    SELECT 'B'          , B           , 'String'           FROM tab
    UNION ALL
    SELECT 'C'          , C           , 'String'           FROM tab
    UNION ALL
    SELECT 'D'          , D           , 'String'           FROM tab
)
SELECT JSON_AGG(JSON_BUILD_OBJECT('name' , "name" , 
                                  'value', "value",
                                  'type' , "type"  )) FROM cte

检查here演示。
如果您的"* String *"类型对于每一行都是相同的,那么您还可以简化子查询并使用CROSS JOIN,如下所示。

WITH cte AS (
    SELECT 'A' AS "name", A AS "value" FROM tab
    UNION ALL
    SELECT 'B'          , B            FROM tab
    UNION ALL
    SELECT 'C'          , C            FROM tab
    UNION ALL
    SELECT 'D'          , D            FROM tab
)
SELECT JSON_AGG(JSON_BUILD_OBJECT('name' , "name" , 
                                  'value', "value",
                                  'type' , "type"  )) FROM cte
CROSS JOIN (SELECT 'String' AS "type") stringtype

查看here演示。

相关问题