2016-08-26 42 views
2

如果我有疑問: -Postgres條件聯合?

SELECT foo FROM baa where foo='value' 

SELECT foo FROM wobble WHERE foo='value' 

我可以寫在Postgres的一個SQL查詢,使得第二查詢不會運行,如果第一個查詢返回結果,而無需使用通用表表達式還是重複第一個查詢?

原因是這兩個查詢都很重,第二個查詢是在第一個查詢不返回結果的情況下回退。

+5

爲什麼你不希望使用CTE? –

回答

2

我懷疑它可以在普通SQL中完成,但是在PL/pgSQL函數中它相當簡單,假設兩個查詢都返回相同的一組列。鑑於這兩個查詢都是「沉重的」,函數的開銷很小。一個額外功能是查詢計劃被緩存,所以連續調用會更快。另一個額外功能是,您可以將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();