ORDER BY DECODE (BLA, [NÚMERO DE COLUMNA]) en una sola consulta columna. ¿Como funciona?

StackOverflow https://stackoverflow.com/questions/2293238

  •  21-09-2019
  •  | 
  •  

Pregunta

Hola necesito ayuda para entender la parte de decodificación de una consulta que es algo como lo siguiente.

SELECT ax.animal_code    
FROM  raw_animal_xref ax,
      animal_xref_type axt
WHERE ax.animal_mnemonic = l_animal_mnemonic -- Example 'COUGAR'
AND   ax.animal_code_type = axt.animal_code_type
ORDER BY DECODE (animal_type, 
                l_type_to_be_matched, -1, -- Example 'CATS'
                l_current_type, 0, -- Example 'BIG CATS'
                nvl(axt.type_search_priority, 100)) ASC; -- EXAMPLE 'Big Cats' Priority is 1

Desde esta consulta devuelve sólo 1 consulta, estoy un poco perplejo sobre cómo el ORDER BY trabajos con los diferentes números de columna no existentes suministrados por DECODE. La consulta funciona como un cursor para encontrar un código único para el animal en cuestión da un animal mnemonic el tipo de animal actual y el tipo de ser emparejado con.

Estoy pensando que decodifican devuelve los diferentes números de las columnas para ordenar antes de y yo tratamos de experimentar con una sola columna diferente sencilla selecciona en algunas otras tablas con ORDER BY '1', '0' y '100' y la ORDER BY parece fallar durante 0 y 100. ¿por qué funciona con -1 o cualquiera de los otros números?

La esperanza alguien puede explicar esto a mí. Gracias!

¿Fue útil?

Solución

Se crea el conjunto que será utilizada para el pedido.

Si animal_type = l_type_to_be_matched, utilice un -1 como valor de ordenación para esa fila
else if = animal_type l_current_type, utilice 0 como valor de ordenación de esa fila
else if axt.type_search_priority es nulo a continuación, utilizar 100 como valor de ordenación de esa fila
más use axt.type_search_priority como valor de ordenación para esa fila.

Se da una especie de cirteria ordenar condicionales. A menudo se utiliza para asegurar que ciertos artículos están siempre en la parte superior o inferior de un conjunto ordenado.

Otros consejos

El ORDER BY puede usar una de las tres expresiones. En primer lugar un alias de la lista de selección, en segundo lugar el número de una columna en la lista de selección o en tercer lugar una expresión SQL que puede utilizar cero o más columnas de las tablas de origen.

Así que cuando se utiliza ORDER BY SUBSTR (col, 2,10) hace su pedido por una subcadena de 10 caracteres del valor de la columna a partir del segundo carácter.

Del mismo modo cuando el uso

ORDER BY decode(col,'DOG',1,'CAT',2,'EEL', 3, 5)

a traducir PERRO en valor 1, CAT en valor 2, EEL en valor 3 y otros en valor 5. A continuación orden por el valor numérico resultante (es decir, el primer perro, a continuación, CAT, entonces EEL, finalmente cualquier otra cosa).

Puede conseguir el mismo pedido utilizando

ORDER BY decode(col,'DOG','A','CAT','B','EEL', 'C', 'D')

En referencia a esta parte de su pregunta:

  

Estoy pensando que devuelve el DECODE   diferentes números de columna a la orden por   He intentado con y experimentar con una   diferentes selecciona simple solo de columna   en algunas otras mesas con ORDER BY   '-1', '0' y '100' y el orden por   parece fallar por 0 y 100. ¿Por qué   que funcione con -1 o cualquiera de los otros   números?

Su confusión es comprensible; pero no, los valores devueltos por la DECODE no se interpretan como números de columna.

Oracle soporta un pequeño atajo sintáctico, en la que las columnas del conjunto de resultados pueden ser referidos a posicionalmente en una cláusula ORDER BY. Así, por ejemplo esto:

SELECT a, b FROM some_table ORDER BY 1,2

es el mismo que:

SELECT a, b FROM some_table ORDER BY a,b

Sin embargo, esta notación posicional sólo puede hacerse con literales enteros no negativos. Si el ORDER BY incluye una expresión que produce un valor numérico, no se interpretará como un número de columna, sino como un valor real a clasificar en. También, literales numéricos negativos se interpretan como valores ordenar, no como números de columna.

SELECT * FROM table ORDER BY -1 clasificará todas las filas en el valor constante -1 (efectivamente sin ordenar).

SELECT * FROM table ORDER BY 0 devolverá un error porque 0 es un número de columna válido.

SELECT * FROM table ORDER BY 1 clasificará todas las filas del valor de la primera columna de la tabla.

SELECT * FROM table ORDER BY 100 clasificará todas las filas sobre el valor de la columna número 100 en la mesa, o devolverá un error si hay menos de 100 columnas.

SELECT * FROM table ORDER BY TO_NUMBER('1') clasificará todas las filas en el valor constante 1.

No he probado esto a fondo, pero mirando a algunos planes de ejecución, parece que incluso se puede especificar un número no entero literal numérico, y se redondeará y se utiliza como un número de columna.

SELECT * FROM table ORDER BY 1.5 aparece para ordenar en el valor de la primera columna.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top