我有一个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"]
吗?
提前致谢!
答案 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$;