2016-08-26 20 views
2

は: -Postgres条件付き結合?私は、クエリがある場合

SELECT foo FROM baa where foo='value' 

SELECT foo FROM wobble WHERE foo='value' 

を私が最初のクエリが共通のを使用せずに結果を返す場合は、2番目のクエリが実行されないようなのpostgresにSQLクエリを書くことができますテーブル式または最初のクエリを繰り返しますか?

両方のクエリがかなり重いため、2番目のクエリは最初のクエリが結果を返さない場合のフォールバックです。

+5

は、なぜあなたは、CTEを使用したくないですか? –

答えて

2

私はプレーンなSQLで行うことはできませんが、PL/pgSQL関数では両方のクエリが同じ列のセットを返すと仮定するとかなり簡単です。両方のクエリが「重い」とすると、関数のオーバーヘッドは最小限に抑えられます。特典として、クエリプランがキャッシュされるため、連続した呼び出しが高速になります。もう1つの特長は、fooをパラメータにして、 "値"以外のものをクエリできるということです。

CREATE FUNCTION run_heavy_query() 
RETURNS TABLE (foo text, ...) AS $$ 
BEGIN 
    RETURN QUERY SELECT foo FROM baa WHERE foo='value'; 
    IF NOT FOUND THEN 
     RETURN QUERY SELECT foo FROM wobble WHERE foo='value'; 
    END IF; 
END; $$ LANGUAGE plpgsql STABLE; 

STABLE機能のボラティリティ修飾子は問い合わせプランナは、連続呼び出しを最適化することができますが、あなたはあなたのクエリで任意のVOLATILE関数呼び出しを使用してはいけません。

今、あなたは、単に

SELECT * FROM run_heavy_query();