条件JOIN语句SQL Server

时间:2014-10-22 22:56:00

标签: sql-server join conditional case

是否可以执行以下操作:

IF [a] = 1234 THEN JOIN ON TableA 
ELSE JOIN ON TableB

如果是,那么正确的语法是什么?

4 个答案:

答案 0 :(得分:53)

我认为您要求的是将初始表加入 Option_A Option_B ,使用LEFT JOIN,会产生这样的东西:

Initial LEFT JOIN Option_A LEFT JOIN NULL
OR
Initial LEFT JOIN NULL LEFT JOIN Option_B

示例代码:

SELECT i.*, COALESCE(a.id, b.id) as Option_Id, COALESCE(a.name, b.name) as Option_Name
FROM Initial_Table i
LEFT JOIN Option_A_Table a ON a.initial_id = i.id AND i.special_value = 1234
LEFT JOIN Option_B_Table b ON b.initial_id = i.id AND i.special_value <> 1234

完成此操作后,您将忽略&#39; NULLS集。这里的附加技巧是在SELECT行中,您需要决定如何处理NULL字段。如果Option_A和Option_B表相似,则可以使用COALESCE函数返回第一个NON NULL值(根据示例)。

另一个选择是你只需要列出Option_A字段和Option_B字段,并让任何使用ResultSet来处理确定使用哪些字段。

答案 1 :(得分:5)

这只是为了添加可以根据条件动态构造查询的要点。 下面给出一个例子。

DECLARE @a INT = 1235
DECLARE @sql VARCHAR(MAX) = 'SELECT * FROM [sourceTable] S JOIN ' + IIF(@a = 1234,'[TableA] A ON A.col = S.col','[TableB] B ON B.col = S.col') 

EXEC(@sql)
--Query will be
/*
SELECT * FROM [sourceTable] S JOIN [TableB] B ON B.col = S.col
*/

答案 2 :(得分:1)

我不同意建议2个左连接的解决方案。我认为表值函数更合适,因此您不会为每个条件提供所有合并和附加连接。

CREATE FUNCTION f_GetData (
    @Logic VARCHAR(50)
) RETURNS @Results TABLE (
    Content VARCHAR(100)
) AS
BEGIN
    IF @Logic = '1234'
        INSERT @Results
            SELECT Content
            FROM Table_1
    ELSE
        INSERT @Results
            SELECT Content
            FROM Table_2
    RETURN
END
GO

SELECT *
FROM InputTable
    CROSS APPLY f_GetData(InputTable.Logic) T

答案 3 :(得分:1)

你可以用 union 来解决这个问题

select a,b from tablea join tableb on tablea.a=tableb.a where b=1234
union select a,b from tablea join tablec on tablec.a=tableb.a where b<>1234