3

我正在尝试编写一个SELECT返回 a RECORDof的查询ROWS

我已经解决了一半的问题,因为我可以得到一条记录来返回一行。但是返回一组 ROWS 呢?

以以下查询为例:

SELECT * FROM
  RECORD(
    (
      ROW(1::integer, 'Florida'::character varying)
    )
  ) AS tbl (id integer, state character varying)

我得到了我的预期:

+==============+
| id | state   |
+====+=========+
| 1  | Florida |
+----+---------+

但是,当我尝试向 RECORD 添加一个额外的 ROW 时,这就是我遇到问题的地方:

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

我预计结果类似于:

+==============+
| id | state   |
+====+=========+
| 1  | Florida |
+----+---------+
| 2  | Georgia |
+----+---------+

但是,我收到了以下 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.

我在这里缺少什么?一些微不足道的事情,还是我接近这一切都错了?非常感谢任何指针或建议,谢谢!

在相关说明中:我知道如果这发生在存储过程中,我可以返回 a SETOF,但是对于这个用例,我有兴趣通过查询直接返回 ROWS 记录,而不使用存储过程。

4

1 回答 1

5

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

select * 
from (
  values 
    (1, 'Florida'),
    (2, 'Georgia')
) AS tbl (id, state);

或使用 CTE

with tbl (id, state) as (
  values 
     (1, 'Florida'),
     (2, 'Georgia')
) 
select * 
from tbl;

如果我没记错的话,使用RECORD关键字会将两行都变成一条记录。一条记录永远不能超过一行。

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

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

values 
  (1, 'Florida'),
  (2, 'Georgia');

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

于 2013-05-31T21:01:12.390 回答