2014-11-14 132 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的角度来看,哪一个会导致更多的麻烦,但我猜测他们离执行路径的角度非常接近,如果数据很小,反正无所谓。