2010-02-19 7 views
11

Hola, necesito ayuda para entender la parte de decodificación de una consulta que es algo como lo siguiente.PEDIDO POR DECODIFICAR (BLAH, [COLUMN NUMBER]) en una consulta de columna única. ¿Como funciona?

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, dado un animal mnemotécnico, el tipo de animal actual y el tipo con el que se emparejará.

Estoy pensando que DECODE devuelve los diferentes números de columna a ORDER BY y traté de experimentar con una columna simple diferente selecciona en otras tablas con ORDER por '-1', '0' y '100' y el ORDEN parece fallar para 0 y 100. ¿Por qué funciona con -1 o con cualquiera de los otros números?

Espero que alguien pueda explicarme esto. ¡Gracias!

Respuesta

4

Crea el conjunto que se utilizará para ordenar.

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 el valor de tipo de esa fila
else if axt.type_search_priority es nulo a continuación, utilizar 100 como el valor de clasificación de esa fila
else utiliza axt.type_search_priority como el valor de ordenamiento para esa fila.

Da un tipo de tipo condicional cirteria. A menudo se utiliza para garantizar que ciertos elementos estén siempre en la parte superior o inferior de un conjunto ordenado.

+1

¡Gracias por responder! Entonces, si la fila actual es un COUGAR IE BIG CAT, se establecerá en 0, que siempre se colocará en la 2ª fila y cuando me encuentre con una fila "Domestic Cat", tipo "CAT", será establecido como -1 IE, estará en la parte superior de mi conjunto. Y si estoy en una fila que no tiene ningún search_priority, estará en la parte inferior de la lista IE 100. ¿Es correcto mi entendimiento? – Azeworai

+0

sí, esa es la idea. Aquí hay otra publicación que describe hacer lo mismo: http://www.orindasoft.com/public/blog/2007/07/oracles-decode-funtion.html –

5

El ORDER BY puede usar una de las tres expresiones. Primero, 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 usar cero o más columnas de las tablas fuente.

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

mismo modo cuando el uso

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

traducir 'CAT' en el valor 1, PERRO en el valor 2 y EEL en el valor 3, entonces el orden por el valor numérico resultante (es decir, el primer perro, entonces CAT , luego EEL, finalmente, cualquier otra cosa).

Puede lograr el mismo orden usando

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

Refiriéndose a esta parte de su pregunta:

Estoy pensando que decodifican devuelve los números de columna diferentes a la orden por con y Traté de experimentar con una columna única simple diferente selecciona en algunas otras tablas con ORDEN por '-1', '0' y '100' y la ORDEN por parece fallar para 0 y 100. ¿Por qué funciona con -1 o cualquiera de los otros números ?

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

Oracle admite un pequeño atajo sintáctico, en el que las columnas del conjunto de resultados se pueden referir a posición en una cláusula ORDER BY. Así, por ejemplo esto:

SELECT a, b FROM some_table ORDER BY 1,2 

es lo 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 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 para ordenar. Además, los literales numéricos negativos se interpretan como valores de clasificación, no como números de columna.

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

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

SELECT * FROM table ORDER BY 1 ordenará todas las filas en el valor de la primera columna de la tabla.

SELECT * FROM table ORDER BY 100 ordenará todas las filas en el valor de la centésima columna de la tabla, o devolverá un error si hay menos de 100 columnas.

SELECT * FROM table ORDER BY TO_NUMBER('1') clasificará todas las líneas de su 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á hacia abajo y se usará como un número de columna.

SELECT * FROM table ORDER BY 1.5 parece ordenar el valor de la primera columna.

Cuestiones relacionadas