2014-11-14 105 views
1

您可以在SELECT語句的FROM子句中使用CASE來確定從哪個表中檢索數據?FROM子句中的CASE語句

我的數據庫有一個表的多個版本。在過程的輸入參數的值會告訴是否從版本1,2或3。我想使用的語法類似於檢索數據的過程:

SELECT * FROM (CASE input_parameter WHEN 1 THEN version1 WHEN 2 THEN version 2 WHEN 3 THEN version3 END) WHERE ... 

可以這樣做?如果是這樣,我使用正確的語法?

+0

可能重複的[如何在動態SQL查詢中設置表名?](http://stackoverflow.com/questions/20678725/how-to-set-table-name-in-dynamic-sql-query) – Allan 2014-11-14 19:01:20

回答

0

它不能在SQL語句本身完成。您需要動態構造SQL語句才能實現這種結果。

0

您不能像直接SQL那樣動態選擇表格。你需要一個存儲過程來完成你想要的。雖然有一些解決方法。

你可以做一些janky在FROM子句這樣的:

SELECT * 
FROM 
    (SELECT null as "whatever") as fakeTable 
    LEFT OUTER JOIN version1 on input_parameter = 1 
    LEFT OUTER JOIN version2 on input_parameter = 2 
    LEFT OUTER JOIN version3 on input_parameter = 3 

這會起作用,因爲input_parameter只能一次一個值。如果你決定你想要version1和version2加入,如果input_parameter是2,那麼你最終會交叉連接,並可能上帝憐憫你的靈魂。

你可以做一些janky與UNION:

SELECT * FROM version1 WHERE input_paramter=1 
UNION ALL 
SELECT * FROM version2 WHERE input_paramter=2 
UNION ALL 
SELECT * FROM version3 WHERE input_paramter=3 

這是更好一點,因爲一個螺絲了,只會帶回2或3倍的結果,而不是搞砸例子1,你在得到n^2或n^3結果。

我不確定從CPU-I/O的角度來看,哪一個會導致更多的麻煩,但我猜測他們離執行路徑的角度非常接近,如果數據很小,反正無所謂。