是否可以执行以下操作:
IF [a] = 1234 THEN JOIN ON TableA
ELSE JOIN ON TableB
如果是,那么正确的语法是什么?
答案 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