Sql 分离postgres中函数返回的记录

Sql 分离postgres中函数返回的记录,sql,postgresql,Sql,Postgresql,我有一个函数,它通过返回两个匿名复合类型的参数 我可以通过如下查询访问各个列: # select * from guess_user('Joe','Bloggs'); confidence | matchid ------------+--------- 0.142857 | 1121 select firstname, lastname, x.confidence, x.matchid from ( select firstname, lastname, guess_use

我有一个函数,它通过返回两个匿名复合类型的参数

我可以通过如下查询访问各个列:

# select * from guess_user('Joe','Bloggs');
 confidence | matchid 
------------+---------
   0.142857 |    1121
select firstname, lastname, x.confidence, x.matchid
from 
(
select firstname, lastname, guess_user(firstname, lastname) as x
from users
limit 5
) q;
现在,我想将此函数的输出与一些数据结合起来:

# select firstname,lastname from users limit 5;
 firstname | lastname 
-----------+----------
 Adam      | Smith
 Amy       | Peters
 Annette   | Bloggs
 Annie     | Mills
 Amanda    | Hibbins
我正在寻找将输出以下内容的查询:

 firstname | lastname | confidence | matchid 
-----------+----------+------------+---------
 Adam      | Smith    |            | 
 Amy       | Peters   |            | 
 Annette   | Bloggs   |            | 
 Annie     | Mills    |            | 
 Amanda    | Hibbins  |            | 
使用该行中的名称调用guess_user的结果填写confidence和matchid列

我目前最努力的是:

# select firstname, lastname, guess_user(firstname, lastname) from users limit 5;
返回:

 firstname | lastname  |  guess_user   
-----------+-----------+---------------
 Angela    | Abbott    | (0.285714,3)
 Amy       | Allan     | (0.285714,4)
 Annette   | Allison   | (0.285714,5)
 Annie     | Ashworth  | (0.285714,6)
 Amanda    | Baird     | (0.285714,7)

有没有办法将guess_用户输出拆分为单独的列?

您需要更改您的功能-最后一个示例与您要求的功能相同。

除非有人过来纠正我,否则我相信答案是目前在8.3中不可能实现,但可以在Postgres 8.4中实现


简单地说:

# select * from guess_user('Joe','Bloggs');
 confidence | matchid 
------------+---------
   0.142857 |    1121
select firstname, lastname, x.confidence, x.matchid
from 
(
select firstname, lastname, guess_user(firstname, lastname) as x
from users
limit 5
) q;

在depesz的解决方案中,您可能需要将“x”括起来,以便将复合记录值与表区分开来,这样您就不会得到以下消息:

missing FROM-clause entry for table "x"

至少我在9.0.2上做到了。结合depesz和fazal的答案,这似乎有效:

select firstname, lastname, (guess_user(firstname, lastname)).*
from users
limit 5

如果它对任何想要进行实验的人都有帮助,下面有一个函数将返回与我使用的记录类型相同的记录类型:创建或替换函数guess_user(firstname varchar,lastname varchar,OUT confidence real,OUT matchid integer),作为$$BEGIN matchid:=1;置信度:=0.5;返回;完;$$语言plpgsql;是否可以将其作为视图来实现
返回记录集
,指示函数返回多行而不是一行。它们不绑定到现有表,如果愿意,可以返回
类型。谢谢,我尝试了一下,但我似乎仍然无法将函数放在正确的位置以使其工作。此页面:似乎表明这是postgres的一个限制,这在8.4中得到了解决(我运行的是8.3.8)要访问复合列的字段,需要写入点和字段名,就像从表名中选择字段一样。事实上,这非常类似于从表名中进行选择,因此您经常必须使用括号来避免混淆解析器。“您必须使用括号来访问复合类型字段:select firstname、lastname、(x).confidence、(x).matchid否则,会出现以下错误:“缺少表“x”的子句条目”