none
Problemas al realizar un IF RRS feed

  • Pregunta

  • Buenas tardes, tengo la siguiente consulta SQL:

    declare @desde date = '27/06/2020',
     @hasta date = '27/06/2020',
     @todo int = 0
     
     IF(@todo = 0)
    
    	IF(@hasta != null)
    
    		SELECT T.idCliente, C.nombre as Cliente, T.fechaTratamiento, Te.nombre as Técnico, T.importe, T.obseAdmin
    		FROM Tratamientos T
    		INNER JOIN Clientes C ON T.idCliente = C.idCliente
    		INNER JOIN Tecnicos Te ON T.idTecnico = Te.idTecnico
    		WHERE T.fechaTratamiento BETWEEN @desde AND @hasta AND C.condFacturacion=0
    		ORDER BY T.fechaTratamiento		
    		
    	ELSE
    
    	SELECT T.idCliente, C.nombre as Cliente, T.fechaTratamiento, Te.nombre as Técnico, T.importe, T.obseAdmin
    		FROM Tratamientos T
    		INNER JOIN Clientes C ON T.idCliente = C.idCliente
    		INNER JOIN Tecnicos Te ON T.idTecnico = Te.idTecnico
    		WHERE T.fechaTratamiento > @desde AND C.condFacturacion=0
    		ORDER BY T.fechaTratamiento	
    		
    ELSE
    
    	SELECT T.idCliente, C.nombre as Cliente, T.fechaTratamiento, Te.nombre as Técnico, T.importe, T.obseAdmin
    	FROM Tratamientos T
    	INNER JOIN Clientes C ON T.idCliente = C.idCliente
    	INNER JOIN Tecnicos Te ON T.idTecnico = Te.idTecnico
    	WHERE C.condFacturacion=0
    	ORDER BY T.fechaTratamiento
    

    El problema es que al llegar al "IF(@hasta != null)" sin importar que valor tome @hasta (aunque tome un valor o sea null), se lo saltea y pasa al ELSE. Probé con != y <> pero sigue haciendo lo mismo

    Saludos y gracias.


    Skull

    sábado, 27 de junio de 2020 23:28

Todas las respuestas

  • Hola Skull15101996:

    La evaluación de null dentro del if se realiza con IS NULL o IS NOT NULL

    IF(@hasta is not null)

    IS NULL

    https://docs.microsoft.com/es-es/sql/t-sql/queries/is-null-transact-sql?view=sql-server-ver15

    domingo, 28 de junio de 2020 4:12
  • Hola Skull15101996:

    Tienes otras opciones para simplificar, de manera que solo tengas una consulta y no 3.

    Set dateformat dmy;
    declare @desde date = '27/06/2020',
     @hasta date = '27/06/2020',
     @todo int = 0;
     
    
    SELECT T.idCliente, C.nombre as Cliente, T.fechaTratamiento, Te.nombre as Técnico, T.importe, T.obseAdmin
    		FROM Tratamientos T
    		INNER JOIN Clientes C ON T.idCliente = C.idCliente
    		INNER JOIN Tecnicos Te ON T.idTecnico = Te.idTecnico
    		WHERE isnull(T.fechaTratamiento,'01/01/1900')
    								BETWEEN case
    											 when @TODO = 0 then @DESDE
    											 else '01/01/1753'
    										 end
    								AND case
    											 when @TODO = 0 then isnull(@HASTA, '01/01/9900')
    											 else '01/01/9900'
    									end and T.condFacturacion = 0 
    								AND C.condFacturacion=0
    		ORDER BY T.fechaTratamiento;

    No se cual es el tipo de dato, de la columna fechaTratamiento, ni si permite null. En el ejemplo he supuesto, que es date y que los permite.

    La propia where establece los tres casos que trabajas en el if, mediante el uso de case y estableciendo un valor máximo que es muy probable, que no alcancen nunca los datos.

    También puedes hacerlo, además de con case, con choose o iif

    Case vs choose vs IIF

    https://javifer2.wordpress.com/2019/10/30/case-vs-choose-vs-iif/

    Otra opción, es realizar las asignaciones correspondientes en las variables, con el mismo objetivo (tener una sola select).

    domingo, 28 de junio de 2020 7:21
  • ¿Alguna novedad sobre la consulta realizada? ¿Han sido útiles las respuestas proporcionadas?  

    lunes, 29 de junio de 2020 16:48
    Moderador