2015-02-05 36 views
0

我有一个plpgsql函数和一个复杂的嵌套SELECT查询,我想返回查询的结果表作为JSON。我会如何去做这件事?我有这样的事情:从函数返回SELECT结果作为JSON(Postgres)

CREATE TEMPORARY TABLE selectRESULTS AS 
/*some long, complicated, and nested SELECT query 
............. 
.............. 
*/ 
RETURN array_to_json(array_agg(selectResults)); 

编辑:我试图解决方案

使用Pozs'的方法之一后增加了额外的规格:

RETURN (SELECT json_agg(selectResults) FROM selectResults); 

我得到一个JSON。但是它与额外的数组嵌套,这使得内部对象难以访问。

目前我得到

[['[{"someKey": someValue}, etc]']] 

有什么办法来摆脱两个外部阵列,这样,而不是使用

somejson[0][0][0]["someKey"]接取someValue,我可以只使用someJson[0]["someKey"]

在此先感谢!

回答

1

总之,你的语法错误;您需要SELECT才能使用聚合函数,如array_agg。您可以使用array()构造太:

-- do NOT use these, these are far from optimal 

RETURN array_to_json(array(SELECT selectResults FROM selectResults)); 
-- or 
RETURN (SELECT array_to_json(array_agg(selectResults)) FROM selectResults); 

json_agg(...)有效地做同样的array_to_json(array_agg(...))但速度更快:

RETURN (SELECT json_agg(selectResults) FROM selectResults); 

注:我以前selectResults选择selectResults表的整行,但如果你只有1列,你可以直接使用它。

但是,根本不需要临时表。如果你的逻辑很简单,你可以使用简单的sql功能,如:

create function xyz(p1_type, ..., pn_type) 
    returns json 
    language sql 
as $func$ 
    select json_agg(select_results) 
    from (
    /*some SELECT query here 
    ............. 
    use $1 ... $<n> for parameters here, 
    or you can name them also within sql functions 
    ............. 
    */ 
) select_results 
$func$; 
+0

谢谢!我还没有尝试过,但我的查询是相当复杂的(嵌套严重,执行各种计算,并与多列工作),所以一个简单的SQL函数可能是不可能的。 – Teboto

+0

编辑我的帖子。你碰巧有一个可以满足我额外规格的替代解决方案吗? – Teboto

+0

@Teboto没有任何关于'selectResults'的更多知识是不可能分辨出来的。 (最可能的解决方案是您的数据已经在数组中)请提供更多详细信息,并且不要在每一个新信息之后改变问题。如果您有新问题,请将其作为单独问题发布。 – pozs