2016-03-29 54 views
0

首先,我在Oracle中有一个返回clob的过程。这个clob包含一个json字符串,我用sql-select从pljson创建。 像这样:Postgres:返回json clob

procedure xyz 
(
    o_json out clob 
) 
is 
    m_json_list json_list := json_list; 
    m_json_temp json; 
begin 
    for cs in (select id, name, birthday from profile)loop 
     m_json_temp := json; 

     m_json_temp.put('id', cs.id); 
     m_json_temp.put('name', cs.name); 
     m_json_temp.put('birthday', cs.birthday); 

     m_json_list.add(m_json_temp); 
    end loop; 
    o_json := convertToClob(m_json_list); 
end xyz; 

现在我想用一个Postgres数据库才达到相同的结果。 我发现的唯一原因是我有一个表,其中有一个类型为'json'的包含整个json的cloumn。这不是我正在寻找的。

有人可以给我一个例子如何在postgresql中实现这种情况?

编辑: 下面是一个例子内连接:

procedure xyz 
(
    o_json out clob 
) 
is 
    m_json_list json_list := json_list; 
    m_json_temp json; 
begin 
    for cs in (select ppf.id, ppf.name, ppf.birthday, ott.info from profile ppf inner join other_table ott on ott.ott_id = ppf.id)loop 
     m_json_temp := json; 

     m_json_temp.put('id', cs.id); 
     m_json_temp.put('name', cs.name); 
     m_json_temp.put('birthday', cs.birthday); 
     m_json_temp.put('info', cs.info); 

     m_json_list.add(m_json_temp); 
    end loop; 
    o_json := convertToClob(m_json_list); 
end xyz; 
+0

为什么不呢,有什么区别? Postgres对待“长”字段(在你的情况下是json),就像Oracle对待clobs一样。那么,你究竟在寻找什么? –

+0

我想与其他表进行连接。 – Lee

+0

您如何在Oracle中执行json连接?你能提供一个例子吗? –

回答

1

所以,你正在寻找一种方式来构建从查询JSON数组。

给定一个表和一些测试数据:

postgres=# create table profile(id serial, name text, birthday date); 
CREATE TABLE 
postgres=# insert into profile(name, birthday) values('John', current_date - interval '30 years'); 
INSERT 0 1 
postgres=# insert into profile(name, birthday) values('Jack', current_date - interval '25 years'); 
INSERT 0 1 

可以代表行作为JSON对象是这样的:

postgres=# select row_to_json(p.*) from profile p; 
        row_to_json     
------------------------------------------------ 
{"id":1,"name":"John","birthday":"1986-03-29"} 
{"id":2,"name":"Jack","birthday":"1991-03-29"} 
(2 rows) 

然后聚合这些JSON对象到一个数组:

postgres=# select json_agg(row_to_json(p.*)) from profile p; 
              json_agg            
-------------------------------------------------------------------------------------------------- 
[{"id":1,"name":"John","birthday":"1986-03-29"}, {"id":2,"name":"Jack","birthday":"1991-03-29"}] 
(1 row) 

更简单的,你可以使用一个聚合,它会做所有的转换哟U:

postgres=# select json_agg(p.*) from profile p; 
        json_agg      
--------------------------------------------------- 
[{"id":1,"name":"John","birthday":"1986-03-29"}, + 
    {"id":2,"name":"Jack","birthday":"1991-03-29"}] 
(1 row) 

(没关系+标志,它是不是JSON的一部分。)