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 输出多维对象的主要内容,如果未能解决你的问题,请参考以下文章
/usr/pgsql-9.3/share/extension 中不存在 Postgres plpythonu 扩展