ORDER BY DECODE (BLAH, [COLONNA NUMERO]) su una singola query colonna. Come funziona?

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

  •  21-09-2019
  •  | 
  •  

Domanda

Ciao ho bisogno di aiuto per capire la parte di decodifica di una query che va qualcosa come il seguente.

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

Dal momento che 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 di trovare un codice univoco per l'animale in questione dato un animale mnemonico tipo di animale corrente e il tipo da abbinare con.

sto pensando che DECODE restituisce i diversi numeri di colonna su cui ordinare con e ho provato a sperimentare con un diverso semplice singola colonna seleziona su alcuni altri tavoli con ORDER da '-1', '0' e '100' e la ORDER bY sembra fallire per 0 e 100. Perché funziona con -1 o uno qualsiasi degli altri numeri?

La speranza qualcuno può spiegare questo a me. Grazie!

È stato utile?

Soluzione

Si crea il set che verrà utilizzato per l'ordinazione.

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 valore di ordinamento di tale riga
uso axt.type_search_priority altro come valore di ordinamento per quella riga.

Si dà una sorta di cirteria ordinamento condizionali. Spesso utilizzato per garantire che alcuni elementi sono sempre in cima o in fondo di un insieme ordinato.

Altri suggerimenti

L'ORDER BY può utilizzare una delle tre espressioni. In primo luogo un alias nell'elenco di selezione, secondo il numero di una colonna nell'elenco di selezione o terzo 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 da un sottostringa 10 carattere del valore della colonna a partire dal secondo carattere.

Allo stesso modo in cui l'uso

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

si traducono in valore DOG 1, CAT in valore 2, EEL in valore 3 e altri in valore 5. Quindi ordine dal valore numerico risultante (cioè DOG, poi CAT, poi EEL, infine qualsiasi altra cosa).

È possibile ottenere lo stesso ordine usando

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

Facendo riferimento a questa parte della tua domanda:

  

sto pensando che DECODE restituisce il   diversi numeri colonna su cui ordinare   con e provato sperimentando un   diversi semplici seleziona colonna singola   su alcuni altri tavoli con ORDER BY   '-1', '0' e '100' e l'ordine da   sembra fallire per 0 e 100. Perché   funziona con -1 o qualsiasi altro   numeri?

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

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

SELECT a, b FROM some_table ORDER BY 1,2

è lo stesso:

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 comprende un'espressione che produce un valore numerico, non sarà interpretato come un numero di colonna, ma come valore effettivo da ordinare su. Inoltre, letterali numerici negativi vengono interpretati come valori di ordinamento, non come numeri di colonna.

SELECT * FROM table ORDER BY -1 ordinerà tutte le righe del valore costante -1 (effettivamente alcun 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 colonna 100 nella tabella, o restituire un errore se ci sono meno di 100 colonne.

SELECT * FROM table ORDER BY TO_NUMBER('1') ordinerà tutte le righe del 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 utilizzato come numero di colonna.

SELECT * FROM table ORDER BY 1.5 appare per ordinare al valore della prima colonna.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top