none
utilizar If CASE RRS feed

  • Pregunta

  • ORDER BY
            if curso=2,
            CASE R.Cod_Clase
            WHEN ''R-1'' THEN 1
            WHEN ''R-2'' THEN 2
            WHEN ''R-3'' THEN 3
           END;
    

    Tabla

    Curso     Codigo

       2           R-3

       2           R-2

       2           R-1

       3           P-3

       3           P-2

       3          P-1

    Lo que quiero en mi consulta es ordenar dependiendo el curso por que los codigos de las clases no son las mismas, osea

    que yo pueda decider que si el curso es 2 ordene como quiera y si es 3 ordene como quiera pero el curso podria ser 4 o 5 o lo que fuera lo importante es poder utilizer el if con el case, arriba el ejemplo gracias

    jueves, 26 de abril de 2018 12:44

Respuestas

  • lo importante es poder utilizer el if con el case

    No, el IF es el equivalente del CASE en código imperativo, o dicho de otra manera, el CASE equivale al IF dentro de una sentencia.

    O sea, lo que tú quieres no es un IF con un CASE, sino un CASE dentro de otro CASE (cosa que es perfectamente legal, los CASE se pueden anidar).

    O sea, que pndrias

    CASE WHEN curso=2 THEN CASE R.Cod_Clase
            WHEN ''R-1'' THEN 1
            WHEN ''R-2'' THEN 2
            WHEN ''R-3'' THEN 3
           END ELSE otrosValoresDeCurso END

    • Marcado como respuesta Efrain Diaz jueves, 26 de abril de 2018 15:09
    jueves, 26 de abril de 2018 14:43

Todas las respuestas

  • Hola Efrain:

    no creo que puedas evaluar un if de ese modo en un order by.

    Puedes hacer algo como esto

    CREATE TABLE ORDENACION (ID INT IDENTITY (1,1), CURSO INT, COD_CLASE VARCHAR(10))
    GO
    INSERT INTO ORDENACION (CURSO, COD_CLASE) VALUES (1,'R-1'), (2,'R-1'),
    (2,'R-2'), (2,'R-1'),
    (2,'R-3'), (2,'R-1'),
    (2,'R-4'), (2,'R-1'),
    (3,'R-5'), (2,'R-1'),
    (2,'R-1'), (2,'R-2'),
    (2,'R-2'), (4,'R-2')
    
    GO
    DECLARE @CURSO INT = 2;
    SELECT * FROM ORDENACION
    WHERE CURSO = 2 AND COD_CLASE = 'R-2'
    ORDER BY 
    
    	CASE WHEN CURSO = 1 
    		THEN COD_CLASE END ASC,
    	CASE WHEN CURSO = 2 AND COD_CLASE = 'R-1' THEN ID END DESC,
    	CASE WHEN CURSO = 2 AND COD_CLASE = 'R-2' THEN COD_CLASE END ASC, ID DESC,
    	CASE WHEN CURSO = 3 AND COD_CLASE = 'R-3' THEN CURSO END ASC,
    	CASE WHEN CURSO = 2 AND COD_CLASE = 'R-3' THEN ID END DESC,
    	case  WHEN CURSO = (
    						CASE	WHEN COD_CLASE ='R-4' THEN ID ELSE 0 END
    						)
    		  THEN ID END ASC,
    	CASE WHEN CURSO > 2 THEN ID END ASC
    			
    		

    Tambien puedes, dentro del then de la expresión anidar otro case....

    Un saludo

    jueves, 26 de abril de 2018 14:22
  • lo importante es poder utilizer el if con el case

    No, el IF es el equivalente del CASE en código imperativo, o dicho de otra manera, el CASE equivale al IF dentro de una sentencia.

    O sea, lo que tú quieres no es un IF con un CASE, sino un CASE dentro de otro CASE (cosa que es perfectamente legal, los CASE se pueden anidar).

    O sea, que pndrias

    CASE WHEN curso=2 THEN CASE R.Cod_Clase
            WHEN ''R-1'' THEN 1
            WHEN ''R-2'' THEN 2
            WHEN ''R-3'' THEN 3
           END ELSE otrosValoresDeCurso END

    • Marcado como respuesta Efrain Diaz jueves, 26 de abril de 2018 15:09
    jueves, 26 de abril de 2018 14:43