我正在尝试撰写一个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不使用存储过程。
答案 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
的地方使用。