sql-server - ejemplos - iif sql ejemplo
DeclaraciĆ³n condicional JOIN SQL Server (3)
Creo que lo que estás pidiendo funcionará uniéndote a la tabla Initial tanto para Option_A como Option_B usando LEFT JOIN
, que producirá algo como esto:
Initial LEFT JOIN Option_A LEFT JOIN NULL
OR
Initial LEFT JOIN NULL LEFT JOIN Option_B
Código de ejemplo:
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
Una vez que haya hecho esto, ''ignorará'' el conjunto de NULLS. El truco adicional aquí es en la línea SELECCIONAR, donde debe decidir qué hacer con los campos NULL. Si las tablas Option_A y Option_B son similares, puede usar la función COALESCE
para devolver el primer valor NON NULL (según el ejemplo).
La otra opción es que simplemente tendrá que enumerar los campos Option_A y Option_B, y dejar que lo que esté usando ResultSet
controle qué campos usar.
¿Es posible hacer lo siguiente?
IF [a] = 1234 THEN JOIN ON TableA
ELSE JOIN ON TableB
Si es así, ¿cuál es la sintaxis correcta?
Esto es solo para agregar el punto de que la consulta se puede construir dinámicamente en función de las condiciones. Un ejemplo se da a continuación.
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
*/
No estoy de acuerdo con la solución que sugiere 2 uniones izquierdas. Creo que una función con valores de tabla es más apropiada para que no tenga todas las uniones adicionales y adicionales para cada condición que tenga.
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