FROM子句中的CASE语句

时间:2014-11-14 18:58:07

标签: select case

您是否可以在CASE语句的FROM子句中使用SELECT来确定从哪个表中检索数据?

我的数据库有多个版本的表。过程中输入参数的值将告诉过程是否从版本1,2或3中检索数据。我尝试使用的语法类似于:

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

可以这样做吗?如果是这样,我使用正确的语法吗?

2 个答案:

答案 0 :(得分:0)

它不能在SQL语句本身中完成。您需要动态构造SQL语句才能实现这种结果。

答案 1 :(得分:0)

您无法在直接SQL中动态选择表格。您需要一个存储过程才能完全按照您的需要进行操作。但是有一些解决方法。

你可以在你的FROM子句中做一些janky,比如:

 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一次只能是一个值。如果input_parameter为2,你是否应该决定你想要加入version1和version2,那么你最终会得到一个交叉连接,而且上帝可能会怜悯你的灵魂。

你可以用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的角度来看哪一个会造成更多麻烦,但我猜他们从执行路径的角度来看非常接近,如果数据很小,那么可能无论如何都不会有问题。