如何使PostgREST自定义函数返回扁平数组而非键值对结构?
解决PostgREST自定义函数返回扁平值数组的问题
你想把当前返回嵌套对象数组的PostgREST函数改成直接输出扁平字符串数组?这个调整其实很简单,核心是修改函数的返回类型和查询逻辑,让PostgREST直接输出数组而非行集合。
问题根源
你当前的函数定义returns table(substance text)意味着返回的是一组行,每行包含一个substance字段。PostgREST默认会把每行序列化成键值对对象,所以最终得到[{substance: "xxx"}, ...]这样的结构。
解决方案:修改函数返回标量数组
我们可以把函数的返回类型改成text[](文本数组),并用array_agg()聚合查询结果,直接生成扁平数组:
create or replace function api.substances(substance_group text) returns text[] as $$ select array_agg(distinct api.emissions.substance order by api.emissions.substance) from api.emissions where api.emissions.substance_group = $1; $$ language sql;
关键调整细节:
- 返回类型变更:从
returns table(substance text)改为returns text[],明确告诉PostgREST我们要返回一个数组而非行集合。 array_agg()聚合:这个函数会把查询到的所有substance值收集到一个数组里,distinct保证结果去重(和你原来的group by效果一致),order by还能让数组内的值有序(可选但推荐)。- 移除多余
group by:因为array_agg()已经完成了聚合操作,不需要再按substance分组,这样查询效率更高。
效果验证
调用修改后的函数后,PostgREST会直接返回你期望的扁平数组:
["Arseen", "Benzo[b]fluorantheen", ...]
这样就不用在客户端额外处理数据结构了,完美匹配你的需求!
内容的提问来源于stack exchange,提问作者Hoetmaaiers
相关产品推荐
相关产品推荐

