以下操作是否可行:
IF [a] = 1234 THEN JOIN ON TableA
ELSE JOIN ON TableB
如果是这样,正确的语法是什么?
如果是这样,正确的语法是什么?
以下操作是否可行:
IF [a] = 1234 THEN JOIN ON TableA
ELSE JOIN ON TableB
如果是这样,正确的语法是什么?
如果是这样,正确的语法是什么?
我认为你所要求的可以通过使用LEFT JOIN
将Initial表连接到Option_A和Option_B两个表,生成类似于以下内容的结果:
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
完成这一步后,您需要“忽略”空值集。在SELECT行中,需要注意一个额外的技巧,即需要决定如何处理空字段。如果Option_A和Option_B表相似,则可以使用COALESCE
函数返回第一个非空值(如示例所示)。
另一种选择是,您只需列出Option_A字段和Option_B字段,让使用ResultSet
的任何内容来处理确定使用哪些字段。
这只是为了补充一点,即查询可以根据条件动态构建。以下是一个示例。
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
*/
你可以使用联合来解决这个问题
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
我不同意建议使用两个左连接的方法。我认为表值函数更合适,这样你就不需要为每个条件进行所有的coalesce和附加连接。
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
我认为更好的方式是以不同的方式思考您的查询,并将其视为集合。
我相信,如果您进行两个单独的查询,然后使用UNION将它们连接起来,这样可以提高性能并使代码更易读。
select ... join on tableA on .... where [A] = 1234 union all select ... join on tableA on .... where [A] <> 1234 or [A] is null
的操作。 - Shannon Severance