从记录类型单列拆分/提取值,将用户定义的函数应用于多行 CTE
Posted
技术标签:
【中文标题】从记录类型单列拆分/提取值,将用户定义的函数应用于多行 CTE【英文标题】:Split/extract values from record-type single column, apply user-defined function to multiple-row CTE 【发布时间】:2013-10-02 08:07:45 【问题描述】:使用 PostgreSQL 9.2,我定义了一个函数,它接受一个参数并返回一个多列表。我想将该函数应用于 CTE 行中的多个参数。我得到的结果是一列元组,而不是我想要的多列。也就是说:
sandbox=# CREATE FUNCTION myfunc(arg int) RETURNS table(col1 int, col2 int) AS
sandbox-# 'SELECT arg+1, arg+2'
sandbox-# LANGUAGE SQL;
CREATE FUNCTION
sandbox=# select * from myfunc(1);
col1 | col2
------+------
2 | 3
(1 row)
sandbox=# WITH rows AS (
sandbox(# SELECT 1 AS arg UNION SELECT 2 AS arg
sandbox(# )
sandbox-# SELECT * FROM (SELECT myfunc(arg) FROM rows) x;
myfunc
--------
(2,3)
(3,4)
(2 rows)
鉴于 CTE,以下两个 SELECT
子句作为具有 record
类型的单个列的表彼此评估相同:
SELECT myfunc(arg) FROM rows;
SELECT * FROM (select myfunc(arg) FROM rows) x;
以下三个都失败了(CTE 未显示):
SELECT myfunc(arg).col1 FROM rows;
ERROR: syntax error at or near "."
LINE 4: SELECT myfunc(arg).col1 FROM rows;
^
SELECT col1 FROM (select myfunc(arg) FROM rows) x;
ERROR: column "col1" does not exist
LINE 4: SELECT col1 FROM (select myfunc(arg) FROM rows) x;
^
SELECT col1 FROM (SELECT * FROM (select myfunc(arg) FROM rows) x) y;
ERROR: column "col1" does not exist
LINE 4: SELECT col1 FROM (SELECT * FROM (select myfunc(arg) FROM row...
^
如何获得一个包含单列元组中的值的多列表?
【问题讨论】:
如果你有postgres 9.3,你可以尝试使用LATERAL
【参考方案1】:
在 myfunc 周围有额外的括号很重要。
select (myfunc(arg)).* from rows;
【讨论】:
宾果游戏。我已经将其标记为正确,但如果可以的话,我会为指向 Postgres 手册的部分加分,人们会读到这一点。我的事后看来不是 20/20。以上是关于从记录类型单列拆分/提取值,将用户定义的函数应用于多行 CTE的主要内容,如果未能解决你的问题,请参考以下文章