2012-12-05 29 views

回答

3

嘗試是這樣的:在PostgreSQL會話變量here

SELECT 'A' 
FROM tableA 
WHERE current_setting(setting_name) = 'setting A' 
UNION ALL 
SELECT 'B' 
FROM tableB 
WHERE current_setting(setting_name) = 'setting B' 

詳細信息。

UPD它會給出SELECT之一的結果。如果current_setting(setting_name)等於'setting A'第一個查詢將返回結果,但第二個將不會。

對於您的示例查詢將看起來像:

SELECT 'A' 
FROM tableA 
WHERE myVar = 1 
UNION ALL 
SELECT 'B' 
FROM tableB 
WHERE myVar != 1 

UPD經過:Postgres的只是執行查詢的一個。 EXPLAIN ANALYZE顯示第二個查詢已計劃但標記爲(never executes)

+0

謝謝,但我不想要一個選擇的聯合,但兩個取決於變量值之一。 –

+0

@AvnerLevy看看'WHERE'子句。它只會給你一個查詢。 –

+0

謝謝,我錯過了。我想知道Postgres是否足夠聰明,可以避免執行不相關的查詢。 –

0

我通常使用存儲過程或UDF(如果您的RDBMS支持它們)。由於您無法將參數傳遞給視圖,因此視圖不適用。但是,你可以通過創建這樣

create view MyView as 
select 1 as MyVar, * from A 
union 
select 2 as MyVar, * from B 

視圖achive類似的東西,在你的應用程序過濾的列MyVar的

select * from MyView where MyVar = :MyVar 

然而,這通常涉及到整個視圖的表掃描。再次,根據RDBMS,您可以在「MyVar」列上添加一個索引並加快此方法。

我推薦使用存儲過程,它會讓你的嘗試更加清晰。

+0

我還沒有嘗試過這個*特定的情況,但PostgreSQL通常足夠聰明,可以將條件壓入視圖。用'EXPLAIN ANALYZE'試試看看查詢是如何執行的;你可能會發現Pg將過濾器應用於工會的兩個分支,而不是產生所有結果,然後掃描它們。 –

+0

由於每個查詢都有很大的性能影響,因此我這樣做並不現實。我正在尋找一種Postgres將從這兩種方式中選擇前沿的方式。 –