如何在PostgreSQL中结合CASE语句和LATERAL JOIN?

时间:2015-03-16 13:14:04

标签: postgresql stored-procedures join conditional lateral

我需要为每个选择行多次调用一个函数,因为函数有几个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?或者还有其他方法只调用一次程序吗?

1 个答案:

答案 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加入中调用包装器,它将按预期运行。