如何在PostgreSQL中将CASE语句与横向联接结合起来?
我需要为每个select行多次调用函数,因为函数有几个OUT参数,我需要所有这些参数 例如 要仅调用此函数一次,请使用横向联接如何在PostgreSQL中将CASE语句与横向联接结合起来?,postgresql,stored-procedures,join,conditional,lateral,Postgresql,Stored Procedures,Join,Conditional,Lateral,我需要为每个select行多次调用函数,因为函数有几个OUT参数,我需要所有这些参数 例如 要仅调用此函数一次,请使用横向联接 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
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
但是如何使用
横向联接实现它呢?是否有一种方法可以在横向连接中使用用例?或者是否有其他方法只调用该过程一次?好问题。您可以创建一个包装函数,当参数为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
join中调用包装器,它的行为将与您预期的一样。我将更改该函数,以便它能够处理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;