从函数返回SELECT结果作为JSON(Postgres)

时间:2015-02-05 04:09:21

标签: postgresql

我有一个plpgsql函数和一个复杂的嵌套SELECT查询,我希望将查询的结果表作为JSON返回。我该怎么做呢?我有这样的事情:

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 个答案:

答案 0 :(得分:2)

简而言之,您的语法错误;您需要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表的整行,但如果您只有一列,则可以直接使用。

但是,您可能根本不需要临时表。如果你的逻辑很简单,你可以使用一个简单的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$;