如何在不使用 If 语句的情况下根据值从 Table A 或 Table B SELECT

How to SELECT from either Table A or Table B based on a Value without using If statement

示例:

Declare @Division int = 1

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

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

这是连接到其他表的更大查询的一部分。

我该怎么做?

如果表具有完全相同的列,您可以执行 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

只需通过 Union

对所有必需的 table 创建视图

创建视图 DivisionWiseData 作为 开始 select *,1 AS 从 tabA 划分 联盟 select *,2 AS 从 tabB 划分 等等...

之后只需使用 select * 来自 dbo.DivisionWiseData 其中 divisionid=@divisionid