在PostgreSQL中返回一行记录

时间:2013-05-31 20:58:20

标签: postgresql postgresql-9.2

我正在尝试撰写一个SELECT查询,该查询返回RECORD ROWS

我已经解决了一半的问题,因为我可以获得一个RECORD来返回一个ROW。但是返回一套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.

我在这里缺少什么?有点琐碎,还是我接近这一切都错了?非常感谢任何指针或建议,谢谢!

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

1 个答案:

答案 0 :(得分: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关键字会将这两行转换为单个记录。记录永远不会超过一行。

编辑(在Craig的评论之后):

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

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

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