我與會話變量工作,我會想創造出執行以下操作的觀點:選擇視圖的select語句通過動態會話變量在PostgreSQL的
if (myVar=1)
select * from my_table where X
else
select * from my_table where Y
其中X和Y是不同的條款。
可能嗎?
這可以用一個常規的select語句(或者我需要存儲過程)來實現嗎?
我與會話變量工作,我會想創造出執行以下操作的觀點:選擇視圖的select語句通過動態會話變量在PostgreSQL的
if (myVar=1)
select * from my_table where X
else
select * from my_table where Y
其中X和Y是不同的條款。
可能嗎?
這可以用一個常規的select語句(或者我需要存儲過程)來實現嗎?
嘗試是這樣的:在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)
。
我通常使用存儲過程或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」列上添加一個索引並加快此方法。
我推薦使用存儲過程,它會讓你的嘗試更加清晰。
我還沒有嘗試過這個*特定的情況,但PostgreSQL通常足夠聰明,可以將條件壓入視圖。用'EXPLAIN ANALYZE'試試看看查詢是如何執行的;你可能會發現Pg將過濾器應用於工會的兩個分支,而不是產生所有結果,然後掃描它們。 –
由於每個查詢都有很大的性能影響,因此我這樣做並不現實。我正在尋找一種Postgres將從這兩種方式中選擇前沿的方式。 –
謝謝,但我不想要一個選擇的聯合,但兩個取決於變量值之一。 –
@AvnerLevy看看'WHERE'子句。它只會給你一個查詢。 –
謝謝,我錯過了。我想知道Postgres是否足夠聰明,可以避免執行不相關的查詢。 –