我有一个成功返回其数据的 PostgreSQL 函数
table(key character varying, value integer)
但我想返回 JSON,因为它更方便。我查看了其他一些答案和文档,但使用别名时会变得复杂(我想返回“key”和“value”作为列名)。
谁能推荐一种表达此功能的最简单明了的方式,不需要额外的复杂性来调用:
DROP FUNCTION get_document_metadata_integer_records_by_document_id(integer);
CREATE OR REPLACE FUNCTION get_document_metadata_integer_records_by_document_id(document_id integer)
RETURNS table(key character varying, value integer) AS
$BODY$
SELECT document_metadata_records.key, document_metadata_integer_records.value FROM document_metadata_integer_records
LEFT OUTER JOIN document_metadata_records
ON document_metadata_integer_records.document_metadata_record_id = document_metadata_records.id
WHERE document_metadata_records.document_id = $1
$BODY$
LANGUAGE sql VOLATILE
COST 100;
ALTER FUNCTION get_document_metadata_integer_records_by_document_id(integer)
OWNER TO postgres;
最佳答案
使用 cross join lateral
作为创建可由 row_to_json
使用的复合类型的简洁路径
create or replace function get_document_metadata_integer_records_by_document_id(
_document_id integer
) returns setof json as $body$
select row_to_json(s)
from
document_metadata_integer_records dmir
left outer join
document_metadata_records dmr on dmir.document_metadata_record_id = dmr.id
cross join lateral
(select dmr.key, dmir.value) s
where dmr.document_id = _document_id
;
$body$ language sql stable;
然后将其用作
select get_document_metadata_integer_records_by_document_id(1) as pair;
或
select pair from get_document_metadata_integer_records_by_document_id(1) j(pair);
或者让它返回一个表
) returns table (pair json) as $body$
并用作
select pair from get_document_metadata_integer_records_by_document_id(1);
旧版本的 Postgresql 没有 lateral
可以在子查询中完成
select row_to_json(s)
from
(
select dmr.key, dmir.value
from
document_metadata_integer_records dmir
left outer join
document_metadata_records dmr on dmir.document_metadata_record_id = dmr.id
where dmr.document_id = _document_id
) s
关于json - PostgreSQL 函数 : Return Multiple Rows as JSON,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25374096/