首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >函数不能返回单个项目的记录,是吗?有什么解决办法吗?

函数不能返回单个项目的记录,是吗?有什么解决办法吗?
EN

Stack Overflow用户
提问于 2014-05-03 01:29:25
回答 2查看 136关注 0票数 0

基本的东西,如在C数据类型中,存在于所有流行的语言中,并且预期这些语言的函数也可以返回一个结构.并且,根据正交原理,您可以访问返回的结构itens。

然而,PostgreSQL没有提供对FUNCTION ... RETURNS RECORD结构的访问。是对的吗?

但是程序员使用PostgreSQL时没有抱怨..。有一个简单直观的解决方法?

类似问题:PostgreSQL v9.X有真正的“记录数组”吗?

用典型案例说明

代码语言:javascript
复制
 CREATE FUNCTION foo(int) RETURNS RECORD AS $$ 
      SELECT $1 as a, 'Hello #'||$1 as b; 
 $$ LANGUAGE SQL;

 SELECT foo(6);       -- works, but I need only one item

SQL上下文中访问记录项

代码语言:javascript
复制
 SELECT (foo(6)).a;   -- NOT works (but no ambiguity!)

 -- For syntax discussion:
 WITH f AS (SELECT foo(6) as r) SELECT r.a FROM f; -- NOT works
 -- ambiguous syntax; confused r with table, in "f.r.a", f with schema 
 -- perhaps r['a'] would be a good syntax solution

PLpgSQL上下文中访问记录itens

怎么说x:=(foo(6)).ay:=foo(6); x:=y.a?现在,在PLpgSQL中有一些预期的行为,至少允许“命名记录”:

代码语言:javascript
复制
CREATE FUNCTION bar() RETURNS text AS $F$ 
DECLARE 
   tmp record;
   s text;
BEGIN 
   -- s:=(foo(7)).b;  NOT WORKS, is like an "anonymous record" (not permitted)
   tmp := foo(6); 
   s:=tmp.b;  -- IT WORKS!! is like a "named record" (permitted)
   RETURN s||'! '||tmp.a;  --  ...works accessing any other individual itens
END;
$F$ LANGUAGE plpgsql IMMUTABLE;
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-05-03 11:53:31

如果您使用更灵活的returns table而不是(有些过时的) returns record,那么事情就变得非常容易了:

代码语言:javascript
复制
CREATE FUNCTION foo(int) RETURNS table (a int, b text) 
AS 
$$ 
  SELECT $1 as a, 'Hello #'||$1 as b; 
$ LANGUAGE SQL;

现在您可以使用:

代码语言:javascript
复制
select b
from foo(6);

如果您关心的是“表”与“记录”,您还可以定义一个type来克服附加的结果集定义:

代码语言:javascript
复制
create type foo_return as (a int, b text);
CREATE FUNCTION foo(int) RETURNS foo_return
AS 
$$ 
  SELECT $1, 'Hello #'||$1;
$$ LANGUAGE SQL;

您仍然可以选择上面的选项:

代码语言:javascript
复制
select b
from foo(6);

第三个可能更像"C“的方法是使用out参数(如手册所示)

代码语言:javascript
复制
CREATE FUNCTION foo(p1 int, out a int, out b text)
AS
$$ 
  SELECT $1, 'Hello #'||$1;
$$ 
LANGUAGE SQL;

那么您就不需要from了:

代码语言:javascript
复制
select (foo(1)).b;
票数 1
EN

Stack Overflow用户

发布于 2014-05-03 01:39:09

这是简单直观的吗?

代码语言:javascript
复制
select a 
from foo(6) s(a int, b text);
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/23439240

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档