procedimientos ejemplos ejemplo dentro consulta condicionales anidados almacenados sql-server join conditional case

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