PostgreSQL函数:返回多行作为JSON
我有一个PostgreSQL函数,它成功地将其数据返回为PostgreSQL函数:返回多行作为JSON,json,postgresql,Json,Postgresql,我有一个PostgreSQL函数,它成功地将其数据返回为 table(key character varying, value integer) 但我想返回JSON,因为它更方便。我已经看过了一些其他的答案和文档,但是使用别名时会变得复杂(我想返回'key'和'value'作为列名) 有人能推荐一种最简单、最简洁的方式来表达这个函数吗?这种方式不需要额外的复杂性来调用: DROP FUNCTION get_document_metadata_integer_records_by_documen
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\u to\u 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;
或
或者让它返回一张桌子
) returns table (pair json) as $body$
并用作
select pair from get_document_metadata_integer_records_by_document_id(1);
对于没有lateral
的较旧版本的Postgresql,可以在子查询中执行此操作
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
结尾的“稳定”是干什么用的?@user1315172检查
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