如何在不使用If语句的情况下基于值从表A或表B中进行选择

时间:2019-03-08 09:27:39

标签: sql sql-server-2014

示例:

Declare @Division int = 1

IF @Division = 1 
BEGIN 
    SELECT * FROM A 
END 
ELSE IF @Division = 2 
BEGIN 
    SELECT * FROM B 
END

问题是,我不想使用if statements,因为有数百个Divisions要考虑。

这是一个较大查询的一部分,该查询已与其他表联接。

我该怎么做?

2 个答案:

答案 0 :(得分:2)

如果表中的列完全相同,则可以执行UNION ALL

declare @Division int = 1

SELECT * FROM A WHERE @Division = 1
UNION ALL
SELECT * FROM B WHERE @Division = 2
-- etc

或者如果它们没有完全相同的列,但是可以从每个列中收集所有有趣的列,则可能会使用更广泛的版本:

SELECT COL1 as ID, COL2 as VALUE, COL3 as DESCR FROM A WHERE @Division = 1
UNION ALL
SELECT COL6 as ID, COL7 as VALUE, NULL as DESCR FROM B WHERE @Division = 2
-- etc

但是,与使用IF的初始版本相比,我不确定这一切的效率如何。

您还可以将所有内容都放在CTE中,以便与其他表轻松连接:

;WITH DivisionCTE (ID, VALUE, DESCR) AS
(
    SELECT COL1 as ID, COL2 as VALUE, COL3 as DESCR FROM A WHERE @Division = 1
    UNION ALL
    SELECT COL6 as ID, COL7 as VALUE, NULL as DESCR FROM B WHERE @Division = 2
    -- etc
)
SELECT *
FROM       DivisionCTE x
INNER JOIN OtherTable  y ON x.ID = Y.ID
-- etc

答案 1 :(得分:1)

只需通过联盟在所有必需的表上创建视图

创建视图DivisionWiseData 如 开始 从tabA中选择*,1 AS部门 联盟 从tabB中选择*,2 AS Division 等等...

之后,只需使用 从dbo.DivisionWiseData中选择*,其中divisionid = @ divisionid