2010-05-11 11 views
12

Tengo una consulta de Oracle en la que quiero que el resultado sea en orden personalizado 'DIRECTOR MAYOR', 'DIRECTOR', 'ADMINISTRADOR', 'EMPLEADO' que es del campo GRADE_DESCRIPTON. Estoy usando la consulta a continuación.Orden personalizado en Oracle PL/SQL

Sin embargo no estoy obteniendo el resultado deseado El orden de la im resultado es conseguir 'director senior', 'administrador', director, 'empleado'

SELECT DISTINCT GRADE_DESCRIPTION 
     , HIRING_FORECATS.* 
FROM GRADE_MASTER left join  HIRING_FORECATS 
    ON (HIRING_FORECATS.GRADE = GRADE_MASTER.GRADE_DESCRIPTION 
     and HIRING_FORECATS.LOCATION = 'HO') 
order by decode  
(GRADE_MASTER.GRADE_DESCRIPTION, 'SENIOR DIRECTOR', 'DIRECTOR', 'MANAGER', 'EMPLOYEE') 

Alguna sugerencia ??

Respuesta

27
ORDER BY DECODE(
     GRADE_MASTER.GRADE_DESCRIPTION, 
     'SENIOR DIRECTOR', 1, 
     'DIRECTOR', 2, 
     'MANAGER', 3, 
     'EMPLOYEE', 4, 
     5) 
2

Se podría añadir una nueva columna a GRADE_MASTER para representar el orden o niveles. Esto permitirá cambiar el orden por cláusula para:

ORDER BY GRADE_MASTER.GRADE_ORDER 

y tiene la ventaja de que sólo requiere cambios en la tabla GRADE_MASTER cuando se introduce un nuevo grado.

10

El punto acerca de decode() es que por cada par de valores sustituye el segundo valor por el primero. Así que su consulta publicada ordena 'DIRECTOR MAYOR' como 'DIRECTOR', 'ADMINISTRADOR' como 'EMPLEADO' y todos los demás al azar después de eso.

Entonces, lo que tiene que hacer es asignar un orden de clasificación a cada valor. La forma más fácil de manejarlo en el futuro sería asignar una columna SORT_ORDER a la tabla GRADE_DESCRIPTION, pero eso no siempre es práctico. Así que si sólo tiene uno o dos informes que deben ser ordenados de esta manera (parece probable) entonces sólo puede continuar con las descripciones no modificables:

SELECT DISTINCT GRADE_DESCRIPTION 
     , HIRING_FORECATS.* 
FROM GRADE_MASTER left join  HIRING_FORECATS 
    ON (HIRING_FORECATS.GRADE = GRADE_MASTER.GRADE_DESCRIPTION 
     and HIRING_FORECATS.LOCATION = 'HO') 
order by decode  
(GRADE_MASTER.GRADE_DESCRIPTION 
    , 'SENIOR DIRECTOR', 10 
     , 'DIRECTOR', 20 
     , 'MANAGER', 30 
     , 'EMPLOYEE', 40 
     , 100) 

Es una buena idea incluir un valor predeterminado , por si acaso. También me gusta dejar grandes huecos en los números de clasificación para facilitar la asignación de un nuevo valor.

3

se debe utilizar una CASO SQL en lugar de una decodificación PL/SQL:

order by CASE WHEN GRADE_MASTER.GRADE_DESCRIPTION = 'SENIOR DIRECTOR' THEN 1 
      WHEN GRADE_MASTER.GRADE_DESCRIPTION = 'DIRECTOR' THEN 2 
      WHEN GRADE_MASTER.GRADE_DESCRIPTION = 'MANAGER' THEN 3 
      WHEN GRADE_MASTER.GRADE_DESCRIPTION = 'EMPLOYEE' THEN 4 
      ELSE 5 
     END 

Esto evitará que el analizador de cambiar entre los modos de PL/SQL y SQL.

+1

Fnord. 'decode()' es una función SQL y siempre lo ha sido. De hecho, a diferencia de 'case()', no se puede usar en PL/SQL (excepto como parte de una instrucción de SQL incorporado). – APC

Cuestiones relacionadas