3

関数には複数の 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)

問題はanullable の場合です。funcnull で呼び出されると例外をスローします。次に、結合なしで私はこのようにします

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 を使用する方法はありますか? または、プロシージャを一度だけ呼び出す他の方法はありますか?

4

1 に答える 1

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期待どおりに動作します。

于 2015-03-16T13:15:52.063 に答える