json - PostgreSQL 函数 : Return Multiple Rows as JSON

标签 json postgresql

我有一个成功返回其数据的 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/

相关文章:

java - 动态 JSON 传递给 REST Web 服务并使用它将数据插入 mysql 数据库

javascript - 如何使用 JavaScript 或 jQuery 清除 JSON 对象

mysql - Group by select 基于 OR 条件

postgresql - 存储过程给出错误 : query has no destination for result data

java - Apache Camel : I can't get an object out of the body and transform it

php - 是否有类似 JQuery PHP 库的东西,使用 $.ajax 而不是 $.php?

macos - Travis OS X 测试 Postgres

postgresql - 提高多列索引和排序的性能

json - 如何在一个结构中包含多个结构?

java - 如何避免在 jOOQ 中对值进行引号