3

我需要为每个选择行多次调用一个函数,因为函数有几个 OUT 参数,所有这些都是我需要的

例如

SELECT
   a, b,
   (SELECT out1 from func(a)),
   (SELECT out2 from func(a))
FROM 
   table1

仅在我使用横向连接时调用此函数

SELECT 
   a, b,
   lat.out1,
   lat.out2
LEFT OUTER JOIN LATERAL (
   SELECT out1, out2 FROM func(a)
) lat ON (TRUE)

问题是万一a可以为空。func抛出异常被 null 调用。然后没有加入我会这样做

SELECT
   a, b,
   CASE WHEN a IS NOT NULL 
       THEN out1 from func(a)
   END,
   CASE WHEN a IS NOT NULL 
       THEN out2 from func(a)
   END
FROM 
   table1

但是我怎么能使用它来实现它lateral joins呢?有没有办法在横向连接中使用 CASE?或者有没有其他方法可以只调用一次程序?

4

1 回答 1

1

好问题。您可以创建一个包装函数,该函数在参数为时返回一个空行集null

create or replace function wrap_func(a int)
returns table(out1 int, out2 int)
as $$
begin
    if a is null then
        return;
    end if;
    return query (
        select  out1, out2
        from    func(a)
    );
end;
$$ language plpgsql;

如果您在联接中调用包装器lateral,它将按照您的预期运行。

于 2015-03-16T13:15:52.063 回答