在PostgreSQL中返回行记录

Jos*_*rns 2 postgresql postgresql-9.2

我正在尝试编写一个SELECT查询,该查询返回RECORDROWS

我已经解决了一半的问题,因为我可以获得一个RECORD返回单个ROW。但是,如何返回一组ROWS呢?

以以下查询为例:

SELECT * FROM
  RECORD(
    (
      ROW(1::integer, 'Florida'::character varying)
    )
  ) AS tbl (id integer, state character varying)
Run Code Online (Sandbox Code Playgroud)

我得到了我的期望:

+==============+
| id | state   |
+====+=========+
| 1  | Florida |
+----+---------+
Run Code Online (Sandbox Code Playgroud)

但是,当我尝试向记录中添加一个额外的ROW时,这是我遇到的问题:

SELECT * FROM
  RECORD(
    (
      ROW(1::integer, 'Florida'::character varying),
      ROW(2::integer, 'Georgia'::character varying)
    )
  ) AS tbl (id integer, state character varying)
Run Code Online (Sandbox Code Playgroud)

我预期结果类似于:

+==============+
| id | state   |
+====+=========+
| 1  | Florida |
+----+---------+
| 2  | Georgia |
+----+---------+
Run Code Online (Sandbox Code Playgroud)

但是,我收到以下PostgreSQL错误:

********** Error **********
ERROR: function return row and query-specified return row do not match
SQL state: 42804
Detail: Returned type record at ordinal position 1, but query expects integer.
Run Code Online (Sandbox Code Playgroud)

我在这里想念什么?琐碎的事,还是我把这一切都弄错了?任何指示或建议,我们将不胜感激,谢谢!

相关说明:我知道如果这要在存储过程中进行SETOF,则可以返回,但是对于此用例,我有兴趣直接通过查询返回ROWS的RECORD,而无需使用存储过程。

a_h*_*ame 5

我不确定如何使用row构造函数执行此操作,但是使用values子句对我来说似乎更容易(也更干净):

select * 
from (
  values 
    (1, 'Florida'),
    (2, 'Georgia')
) AS tbl (id, state);
Run Code Online (Sandbox Code Playgroud)

或使用CTE

with tbl (id, state) as (
  values 
     (1, 'Florida'),
     (2, 'Georgia')
) 
select * 
from tbl;
Run Code Online (Sandbox Code Playgroud)

使用的RECORD关键词变成两行成一个单一的记录,如果我没有记错。一条记录最多只能容纳一行。

编辑(在克雷格评论后):

为了完成图片,以下内容将返回完全相同的结果,尽管无法指定列名:

values 
  (1, 'Florida'),
  (2, 'Georgia');
Run Code Online (Sandbox Code Playgroud)

可以在任何可以使用的地方SELECT使用。