返回PostgreSQL中的行记录

返回PostgreSQL中的行记录,postgresql,postgresql-9.2,Postgresql,Postgresql 9.2,我正在尝试编写一个SELECT查询,它返回一条行的记录 我已经解决了一半的问题,因为在中,我可以得到一个返回一行的记录。但是返回一组行怎么样 以以下查询为例: SELECT * FROM RECORD( ( ROW(1::integer, 'Florida'::character varying) ) ) AS tbl (id integer, state character varying) 我得到了我所期望的: +==============+ | id

我正在尝试编写一个
SELECT
查询,它返回一条
行的
记录

我已经解决了一半的问题,因为在中,我可以得到一个返回一行的记录。但是返回一组行怎么样

以以下查询为例:

SELECT * FROM
  RECORD(
    (
      ROW(1::integer, 'Florida'::character varying)
    )
  ) AS tbl (id integer, state character varying)
我得到了我所期望的:

+==============+
| id | state   |
+====+=========+
| 1  | Florida |
+----+---------+
但是,当我尝试向记录中添加一行时,我会遇到以下问题:

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.
我错过了什么?一些琐碎的事情,还是我处理这一切都错了?非常感谢您的指点和建议


另一方面:我知道如果这发生在存储过程中,我可以返回
集合,但是对于这个用例,我感兴趣的是直接通过查询返回行记录,而不使用存储过程。

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

或者使用CTE

with tbl (id, state) as (
  values 
     (1, 'Florida'),
     (2, 'Georgia')
) 
select * 
from tbl;
如果我没弄错的话,使用
RECORD
关键字将两行都变成一条记录。一条记录最多只能保存一行

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

要完成此图,以下内容将返回完全相同的结果,尽管不可能指定列名:

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

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

我相信这确实涵盖了我的用例!也许我对记录的工作原理有误解,但我仍然很好奇如何利用行。非常感谢您的时间。:)@约书亚·伯恩斯:事实上,我认为你不能在PL/pgSQL之外使用
RECORD
,但我不能完全确定。但是
RECORD
始终表示一行(记录)。所以我认为这是行不通的。
VALUES
构造是正确的方法。实际上,您不需要使用
选择
VALUES
是一个有效的独立查询。@CraigRinger:如果不使用
select
或cte,您将如何为
VALUES
子句的列命名?@a_horse__,但不使用名称,它们被指定为默认名称
column1,column2。。。列
*n*。根据调用上下文,您可能不在乎。我之所以要指出这一点,是因为人们通常没有意识到,
VALUES
是一个独立的语句;当然,包装它更有用,但理解为什么这样做是有价值的。
values 
  (1, 'Florida'),
  (2, 'Georgia');