【问题标题】:PostgreSQL Function: Return Multiple Rows as JSONPostgreSQL 函数:以 JSON 格式返回多行
【发布时间】:2014-08-19 00:42:00
【问题描述】:

我有一个 PostgreSQL 函数,它成功地将其数据返回为

table(key character varying, value integer)

但我想返回 JSON,因为它更方便。我查看了其他一些答案和文档,但是使用别名时会变得复杂(我想返回“键”和“值”作为列名)。

有人可以推荐表达这个函数的最简单和简洁的方式,以一种不需要额外复杂调用的方式:

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;

【问题讨论】:

    标签: json postgresql


    【解决方案1】:

    使用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);
    

    对于没有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
    

    【讨论】:

    猜你喜欢
    • 2013-05-19
    • 1970-01-01
    • 2011-06-11
    • 1970-01-01
    • 2022-11-01
    • 2017-02-24
    • 2014-04-29
    • 1970-01-01
    • 2013-08-06
    相关资源
    最近更新 更多