2010-02-19 2 views
11

Ciao, ho bisogno di aiuto per capire la parte di decodifica di una query che va come la seguente.ORDINA DA DECODE (BLAH, [NUMERO COLONNA]) su una singola query di colonna. Come funziona?

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 

Poiché questa query restituisce solo 1 domanda, io sono un po 'perplesso su come ORDER BY opere con i diversi numeri di colonna non-esistenti forniti da DECODE. La query funziona come un cursore per trovare un codice univoco per l'animale in questione, dato un codice mnemonico animale il tipo di animale corrente e il tipo da abbinare.

Sto pensando che DECODE restituisca i diversi numeri di colonna a ORDER BY con e ho provato a sperimentare con una singola colonna semplice diversa seleziona su alcune altre tabelle con ORDER di '-1', '0' e '100' e l'ordine da sembra fallire per 0 e 100. Perché funziona con -1 o uno qualsiasi degli altri numeri?

Spero che qualcuno possa spiegarmi questo. Grazie!

risposta

4

Crea il set che verrà utilizzato per l'ordine.

Se animal_type = l_type_to_be_matched, utilizzare un -1 come valore di ordinamento per quella riga
altrimenti se animal_type = l_current_type, utilizzare 0 come valore tipo di quella riga
altrimenti se axt.type_search_priority è nullo quindi utilizzare 100 come il valore di ordinamento di quella riga
altrimenti utilizzare axt.type_search_priority come valore di ordinamento per quella riga.

Fornisce un tipo di cirteria ordinata condizionale. Spesso utilizzato per garantire che determinati elementi siano sempre nella parte superiore o inferiore di un set ordinato.

+1

Grazie per aver risposto! Quindi vuol dire che se la riga corrente è COGAR IE BIG CAT, verrà impostata come 0, che verrà sempre inserita nella seconda riga e quando incontrerò una riga "Gatto domestico" IE "CAT" sarà impostato come -1 IE sarà in cima al mio set. E se sono su una fila che non ha alcuna search_priority, sarà in fondo alla lista IE 100. La mia comprensione è corretta? – Azeworai

+0

sì, questa è l'idea. Ecco un altro post che descrive la stessa cosa: http://www.orindasoft.com/public/blog/2007/07/oracles-decode-funtion.html –

5

L'ORDER BY può utilizzare una delle tre espressioni. In primo luogo un alias dell'elenco di selezione, in secondo luogo il numero di una colonna nell'elenco di selezione o in terzo luogo un'espressione SQL che può utilizzare zero o più colonne dalle tabelle di origine.

Quindi quando si utilizza ORDER BY SUBSTR (col, 2,10) si ordina con una sottostringa di 10 caratteri del valore della colonna a partire dal secondo carattere.

Analogamente quando l'uso

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

tradurre 'CAT' nel valore 1, DOG nel valore 2 e EEL nel valore 3, quindi ordinate dal valore numerico risultante (cioè DOG, poi CAT , poi EEL, infine qualsiasi altra cosa).

È possibile ottenere lo stesso ordinamento utilizzando

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

Riferendosi a questa parte della tua domanda:

sto pensando che DECODE restituisce i diversi numeri di colonna su ordinazione da con e Ho provato a sperimentare con una singola colonna semplice seleziona su alcune altre tabelle con ORDINA di "-1", "0" e "100" e l'ORDINE di sembra non riuscire per 0 e 100. Perché funziona con -1 o uno degli altri numeri ?

La vostra confusione è comprensibile; ma no, i valori restituiti da DECODE non vengono interpretati come numeri di colonna.

Oracle supporta una piccola scorciatoia sintattica, in cui le colonne del set di risultati possono essere indirizzate in modo posizionale in una clausola ORDER BY. Così, per esempio questo:

SELECT a, b FROM some_table ORDER BY 1,2 

è uguale a:

SELECT a, b FROM some_table ORDER BY a,b 

Tuttavia, questa notazione posizionale può essere fatto solo con gli interi non negativi. Se ORDER BY include un'espressione che produce un valore numerico, non verrà interpretato come un numero di colonna, ma come un valore effettivo da ordinare. Inoltre, i valori letterali numerici negativi vengono interpretati come valori di ordinamento, non come numeri di colonna.

SELECT * FROM table ORDER BY -1 ordinerà tutte le righe sul valore costante -1 (in pratica senza ordinamento).

SELECT * FROM table ORDER BY 0 restituirà un errore perché 0 è un numero di colonna non valido.

SELECT * FROM table ORDER BY 1 ordinerà tutte le righe sul valore della prima colonna della tabella.

SELECT * FROM table ORDER BY 100 ordinerà tutte le righe sul valore della centesima colonna della tabella o restituirà un errore se ci sono meno di 100 colonne.

SELECT * FROM table ORDER BY TO_NUMBER('1') fascicolerà tutte le righe sul valore costante 1.

non ho ancora testato questo fuori a fondo, ma guardando alcuni piani di esecuzione, sembra che si può anche specificare un non intero letterale numerico, e sarà arrotondato per difetto e usato come numero di colonna.

SELECT * FROM table ORDER BY 1.5 sembra ordinare sul valore della prima colonna.