我需要为每个选择行多次调用一个函数,因为函数有几个OUT参数,所有这些都是我需要的
E.g。
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?或者还有其他方法只调用一次程序吗?
答案 0 :(得分: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
加入中调用包装器,它将按预期运行。