【问题标题】:How to combine a CASE statement with a LATERAL JOIN in PostgreSQL?如何在 PostgreSQL 中将 CASE 语句与 LATERAL JOIN 结合起来?
【发布时间】:2015-05-18 14:56:03
【问题描述】:

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

【问题讨论】:

  • 我会更改函数以便它能够处理null

标签: postgresql stored-procedures join conditional lateral


【解决方案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 连接中调用包装器,它将按您的预期运行。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2022-12-06
    • 1970-01-01
    • 2016-12-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-09-09
    相关资源
    最近更新 更多