返回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');