【问题标题】:Feed function with result of another function in PostgreSQLFeed 函数与 PostgreSQL 中另一个函数的结果
【发布时间】:2015-10-13 20:39:29
【问题描述】:

我有一个函数可以选择一些有趣行的 ID:

CREATE OR REPLACE FUNCTION ChannelSelection(...)
RETURNS TABLE(
    ChannelId INTEGER
) AS [...] 

它需要一些参数用于过滤目的并返回SETOF INTEGER

我想用这个函数ChannelSelection 的结果来喂另一个,它接受INTEGER[] 作为输入:

CREATE OR REPLACE FUNCTION DataP2AMean(
      _channelid INTEGER[] = NULL
)
    RETURNS TABLE(
        ChannelId INTEGER,
        ...
    )  AS
$BODY$
SELECT
    D2.ChannelId,
    ...
FROM
    ...
WHERE
    D2.ChannelId = ANY(_channelid)
    OR _channelid IS NULL

$BODY$ LANGUAGE SQL;

当我发出以下查询时:

SELECT *
FROM DataP2AMean(_channelid := ChannelSelection(_site := '{41WOL1,41N043}'))

我收到此错误:

ERROR: Function datap2amean(integer) doesn't exist
State SQL :42883 (undefined_function)

我不明白,因为我可以单独使用这些功能。看起来它正在搜索另一个签名,因此 ChannelSelection 只返回一个整数,但事实并非如此。

我错过了什么?

【问题讨论】:

  • 我现在知道这是一个签名问题,但我不知道如何使 INTEGER[] 和 SETOF INTEGER 匹配。有什么想法吗?

标签: postgresql function signature


【解决方案1】:

channelselection 返回整数的 (=set)。所以可能有很多很多行,只有一个整数列。 datap2amean 需要一个 single (数组)值,而不是一组整数值。

不幸地使用例如

select array_agg(i) from channelselection('{41WOL1,41N043}') i

仍然无济于事,因为这也会返回一个 set 整数数组。我们知道它只会返回单行 - 但是单行和一个数组列仍然不同于单个整数数组值。

因此,您需要将结果转换为单个值,例如像这样:

(select array_agg(i) from channelselection('{41WOL1,41N043}') i)::int[]

然后可以将其用作其他函数的参数:

SELECT *
FROM datap2amean ( (select array_agg(i) from channelselection('{41WOL1,41N043}') i)::int[] )

【讨论】:

  • SELECT * FROM airpy.DataP2AMean(_channelid := array(SELECT * FROM airpy.ChannelSelection(_site := '{41WOL1,41N043}'))) 也可以,我刚刚找到了。无论如何感谢您的回答
猜你喜欢
  • 1970-01-01
  • 2022-01-26
  • 2022-07-25
  • 1970-01-01
  • 2013-12-16
  • 1970-01-01
  • 1970-01-01
  • 2016-04-22
  • 2020-02-01
相关资源
最近更新 更多