Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/postgresql/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在PostgreSQL中将CASE语句与横向联接结合起来?_Postgresql_Stored Procedures_Join_Conditional_Lateral - Fatal编程技术网

如何在PostgreSQL中将CASE语句与横向联接结合起来?

如何在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行多次调用函数,因为函数有几个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 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;