Postgres 9.3 JSON 输出多维对象

Posted

技术标签:

【中文标题】Postgres 9.3 JSON 输出多维对象【英文标题】:Postgres 9.3 JSON Output multi-dimensional object 【发布时间】:2013-10-15 10:11:09 【问题描述】:

鉴于此查询:-

SELECT id as id,
       attributes->>'name' as file_name, 
       status 
from workflow.events 
where schema='customer' 
  and type='FILE_UPLOAD'

id,file_name, status
1,name,status
2,name2,status2

我想输出这个结构:-


 "1" :"id" :"1", "file_name" : "name", "status" : "status1",
 "2" :"id" :"2", "file_name" : "name2","status" : "status2"

我现在可以使用字符串函数来做到这一点,但这看起来很混乱且效率低下。可以使用原生的postgresql json函数来完成吗?

【问题讨论】:

JSON output in Postgresql的可能重复 有几个有用的json函数,即row_to_json(),应该会派上用场:postgresql.org/docs/current/static/functions-json.html 【参考方案1】:

如果你想用json获取两条记录,使用row_to_json()函数:

with cte as (
    select 
        id as id,
        attributes->>'name' as file_name, 
        status 
     from workflow.events 
     where schema='customer' and type='FILE_UPLOAD'
)
select row_to_json(c) from cte as c

输出:

"id":1,"file_name":"name","status":"status"
"id":2,"file_name":"name2","status":"status2"

如果要获取json数组:

with cte as (
    select 
        id as id,
        attributes->>'name' as file_name, 
        status 
     from workflow.events 
     where schema='customer' and type='FILE_UPLOAD'
)
select json_agg(c) from cte as c

输出:

["id":1,"file_name":"name","status":"status", 
 "id":2,"file_name":"name2","status":"status2"]

但是对于你想要的输出,我只能建议字符串转换:

with cte as (
    select 
        id::text as id,
        file_name, 
        status 
    from workflow.events 
    where schema='customer' and type='FILE_UPLOAD'
)
select ('' || string_agg('"' || id || '":' || row_to_json(c), ',') || '')::json from cte as c

sql fiddle demo

【讨论】:

连接的最后一步,在row_to_json() 完成大部分工作之后应该已经足够了。我会删除我的答案,因为你取消了你的答案,你的答案很好。 感谢@ErwinBrandstetter,我看到 PostgreSQL 有 json_each 从 json 中获取数据,其结构类似于此输出,但似乎它没有像 OP 想要的那样做其他方式的功能:( 在 postgres 9.3 中关于 JSON 功能的例子很少,这个答案很有启发性!谢谢罗马

以上是关于Postgres 9.3 JSON 输出多维对象的主要内容,如果未能解决你的问题,请参考以下文章

sh 安装postgres 9.3

postgres 9.3 windows的空密码登录失败

如何在 Postgres 9.3 中获取当前时区名称?

/usr/pgsql-9.3/share/extension 中不存在 Postgres plpythonu 扩展

如何在 swift 4.1 和 xcode 9.3 中使用 JSONDecoder 解码嵌套的 JSON 数组和对象?

js如何操作多维json数组?