函数将多列作为单列而不是多列返回

Posted

技术标签:

【中文标题】函数将多列作为单列而不是多列返回【英文标题】:function returns multiple columns as a single column instead of multiple columns 【发布时间】:2011-08-15 23:34:24 【问题描述】:

我目前正在 postgresql 9.04 中编写一个函数,我正在尝试使用一个变量,该变量将在 select 语句中使用,然后返回结果。

我想出的陈述很简单而且有效;但是,所有列都输出到单列而不是多列。

这是我的功能:

create or replace function foo(IN pID integer, OUT project_id integer, OUT project_name    text, OUT project_type text, OUT project_description text, OUT project_status text)
returns setof record as

$$
select project_id, project_name, project_type, project_description, project_status from     t_projects
where project_id = $1;
$$

LANGUAGE SQL;


select foo(6) -- runs function

当前输出如下所示:

"(6,"test project","inbound","inbound test","processing")"

我怎样才能使结果不会连接在一起并单独返回每个列项?

提前谢谢你。

【问题讨论】:

为什么你有一个setof record 的返回类型,同时还声明了与SELECT 匹配的OUT 列?您打算返回记录,还是填充OUT 参数?您应该选择一种方法,而不是两种方法。 postgresql 对我来说仍然是新的,因为我习惯于在 microsoft sql erver 中工作。理想情况下,我想从 select 语句中返回结果。在我的谷歌搜索中,我发现人们会创建一个具有指定输出的类型或将输出放入函数中。目前,我还处于对postgresql的理解阶段:) 【参考方案1】:

你需要这样调用函数:

select * from foo(6);

这将返回如下内容:

project_id | project_name | project_type | project_description | project_status
-----------|--------------|--------------|---------------------|----------------
         6 | test project |      inbound |        inbound test |     processing

这是 postgres 的一个怪癖,它可以双向调用并给你一个结果。您可能还想查看有关 set 返回函数的文档,还有其他方法可以做到这一点。哦,上面有一个 wiki 页面,是为 plpgsql 编写的,但大多数也适用于 sql 函数:http://wiki.postgresql.org/wiki/Return_more_than_one_row_of_data_from_PL/pgSQL_functions

【讨论】:

为什么在用create or replace function foo( int) returns setof record as $$ SELECT $1 as a, 'xx' as b; $$ LANGUAGE SQL; 定义foo() 时select * from foo(6) 会出错?? @Peter-Krauss 好吧,如果你调用它,你会得到:错误:返回“记录”的函数需要列定义列表这意味着 Postgres 不了解返回值的结构应该。您需要添加 OUT 参数,就像在原始问题中一样,或者使用定义列表调用它:pagila=# select * from foo(1) f (a int, b unknown); WARNING: column "b" has type "unknown" DETAIL: Proceeding with relation creation anyway. a | b ---+---- 1 | xx (1 row)

以上是关于函数将多列作为单列而不是多列返回的主要内容,如果未能解决你的问题,请参考以下文章

多列外键:将单列设置为 Null “ON DELETE”而不是全部

R语言dplyr包arrage函数排序dataframe实战:单列排序多列排序自定义排序

从记录类型单列拆分/提取值,将用户定义的函数应用于多行 CTE

pandas使用iloc函数基于dataframe数据列的索引抽取单列或者多列数据其中多列索引需要嵌入在列表方括号[]中或使用:符号形成起始和终止范围索引

关于Oracle中实现单列拆分成多列的技术应用

将多列作为参数传递给函数,并从函数中为python中的数据框获取新列