PostgreSQL函数:返回多行作为JSON

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

我有一个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\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