sql - 将多行(查询结果)传递给函数

标签 sql postgresql postgresql-9.3

我有一个来自函数的 SELECT(带有普通参数,而不是 SETOF 参数)。但是,我想在查询中多次调用该函数(然后聚合结果),并为其提供 CTE。

一些(示例)代码:

CREATE TYPE MY_TYPE AS ( a integer, b integer );

CREATE OR REPLACE FUNCTION foo( foobar INTEGER ) 
RETURNS MY_TYPE AS $$
BEGIN
  -- do something, return MY_TYPE
END;  
$$ LANGUAGE plpgsql;

WITH x AS (
  SELECT a FROM bar WHERE b = 1
)
SELECT min(a) FROM foo( (SELECT a FROM x) ) f

这不起作用,我收到以下错误消息:

ERROR:  more than one row returned by a subquery used as an expression

现在我想知道如何重写查询。我可以遍历 CTE 结果,然后一次用一个输入值调用该函数,将结果存储在一列中,最后找到最小值——这感觉很笨拙而且应该很慢。另一种方法是将我的函数包装在另一个设置返回的数组参数中。但这只是把问题推开了:我不知道如何简单地包装它。

将函数重写为 SETOF 形式似乎没问题。尽管如此,这仍然是一种解决方法,学习如何调用查询返回的多行的普通函数(如果可能的话)会更好。

最佳答案

试试这个:

SELECT min(f.a)
  FROM bar  
  CROSS JOIN foo(bar.a) f
  WHERE bar.b = 1

关于sql - 将多行(查询结果)传递给函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25680101/

相关文章:

sql - 从联合 mysql 查询中获取帖子数?

java - hibernate 3 : unable to query PostgreSQL database

ruby-on-rails - pg_search 使用一个文本字段和一个类别选择类型字段

postgresql - 删除 pg_xlog 文件后 Postgres 不会启动

postgresql - 使用 DEFAULT 处理 PostgreSQL View 触发器中的 NULL 值?

mysql - SQL 设置日期戳

sql - 坚持 SQL 连接查询

java - Postgres 错误(设置 PLJava)

sql - Postgres 递增列中的空值

sql - nosql 是什么意思?有人可以用简单的话向我解释一下吗?