您是否可以在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 ...
可以这样做吗?如果是这样,我使用正确的语法吗?
答案 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的角度来看哪一个会造成更多麻烦,但我猜他们从执行路径的角度来看非常接近,如果数据很小,那么可能无论如何都不会有问题。