2010-02-19 5 views
11

Hallo Ich brauche Hilfe, um den Dekodierungsteil einer Abfrage zu verstehen, die etwas wie folgt geht.ORDER BY DECODE (BLAH, [SPALTENUMMER]) für eine einzelne Spaltenabfrage. Wie funktioniert es?

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 

Da diese Abfrage nur 1 Abfrage gibt, ich bin ein wenig ratlos, wie die ORDER BY Arbeiten mit den verschiedenen nicht-vorhandenen Spaltennummern von DECODE geliefert. Die Abfrage arbeitet als ein Cursor, um einen eindeutigen Code für das fragliche Tier zu finden, wobei eine Tier-Mnemonik dem aktuellen Tiertyp und dem Typ gegeben wird, mit dem sie übereinstimmen sollen.

Ich denke, dass DECODE die verschiedenen Spaltennummern zu ORDER BY zurückgibt und ich versuchte, mit einer anderen einfachen einzelnen Spalte zu experimentieren wählt auf einigen anderen Tabellen mit ORDER by '-1', '0' und '100' und die ORDER by scheint für 0 und 100 zu scheitern. Warum funktioniert es mit -1 oder einer der anderen Zahlen?

Hoffe jemand kann mir das erklären. Vielen Dank!

Antwort

4

Es erstellt den Satz, der für die Bestellung verwendet wird.

Wenn animal_type = l_type_to_be_matched, verwenden Sie ein -1 als der Sortierwert für diese Zeile
else if animal_type = l_current_type, 0 als Wert sortiert Verwendung dieser Zeile
else if axt.type_search_priority null ist dann 100 zu verwenden, wie der Sortierwert dieser Zeile
sonst axt.type_search_priority als Sortierwert für diese Zeile verwenden.

Es gibt eine Art bedingte Sortierung cirteria. Wird häufig verwendet, um sicherzustellen, dass sich bestimmte Elemente immer oben oder unten in einer sortierten Gruppe befinden.

+1

Danke für die Beantwortung! Es bedeutet also, wenn die aktuelle Zeile ein COUGAR IE BIG CAT ist, wird es als 0 gesetzt, was es immer in die zweite Zeile setzt, und wenn ich auf eine "Domestic Cat" Zeile IE "CAT" tippe, wird es sein eingestellt als -1 IE, wird es auf meinem Set sein. Und wenn ich in einer Reihe bin, die keine search_priority hat, wird es am Ende der Liste IE 100 sein. Ist mein Verständnis richtig? – Azeworai

+0

Ja, das ist die Idee. Hier ist ein weiterer Beitrag, der das Gleiche beschreibt: http://www.orindasoft.com/public/blog/2007/07/oracles-decode-funtion.html –

5

Die ORDER BY kann einen von drei Ausdrücken verwenden. Erstens ein Alias ​​der Auswahlliste, zweitens die Nummer einer Spalte in der Auswahlliste oder drittens ein SQL-Ausdruck, der null oder mehr Spalten aus den Quellentabellen verwenden kann.

So, wenn Sie ORDER BY SUBSTR (col, 2,10) verwenden, bestellen Sie durch eine 10-stellige Teilzeichenfolge des Spaltenwerts beginnend mit dem zweiten Zeichen.

Ähnlich, wenn die Verwendung

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

Sie durch den resultierenden numerischen Wert (dh DOG zuerst, dann CAT ‚CAT‘ in den Wert 1, DOG in den Wert 2 und EEL in den Wert 3, dann bestellen übersetzen , dann EEL, endlich was anderes).

Sie können die gleiche Reihenfolge erreichen

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

zu diesem Teil Ihrer Frage Bezug mit:

Ich denke, dass DECODE gibt die verschiedenen Spaltennummern BY ORDER mit und Ich habe versucht, mit einer verschiedenen einfachen einzelnen Spalte experimentiert wählt auf einigen anderen Tabellen mit ORDER by '-1', '0' und '100' und die ORDER von scheint für 0 und 100 zu versagen. Warum funktioniert mit -1 oder einer der anderen Zahlen?

Ihre Verwirrung ist verständlich; Nein, die vom DECODE zurückgegebenen Werte werden nicht als Spaltennummern interpretiert.

Oracle unterstützt eine kleine syntaktische Verknüpfung, in der die Spalten der Ergebnismenge bezeichnet werden kann, in einer ORDER BY-Klausel positionell. So zum Beispiel dieses:

SELECT a, b FROM some_table ORDER BY 1,2 

ist die gleiche wie:

SELECT a, b FROM some_table ORDER BY a,b 

Allerdings kann diese Stellenschreibweise nur mit nicht-negativen Ganzzahlliterale erfolgen. Wenn ORDER BY einen Ausdruck enthält, der einen numerischen Wert erzeugt, wird er nicht als Spaltennummer interpretiert, sondern als tatsächlicher Wert, der sortiert werden soll. Negative numerische Literale werden auch als Sortierwerte und nicht als Spaltennummern interpretiert.

SELECT * FROM table ORDER BY -1 werden alle Zeilen auf dem konstanten Wert sortieren -1 (effektiv keine Sortierung).

SELECT * FROM table ORDER BY 0 einen Fehler zurück, da 0 eine ungültige Spaltennummer.

SELECT * FROM table ORDER BY 1 werden alle Zeilen auf den Wert der ersten Spalte in der Tabelle sortieren.

SELECT * FROM table ORDER BY 100 sortiert alle Zeilen nach dem Wert der 100. Spalte in der Tabelle oder gibt einen Fehler zurück, wenn weniger als 100 Spalten vorhanden sind.

SELECT * FROM table ORDER BY TO_NUMBER('1') wird alle Zeilen auf dem konstanten Wert sortieren 1.

Ich habe dies nicht gründlich getestet, aber bei einigen Ausführungsplänen sucht, scheint es, dass Sie auch eine nicht-ganzzahligen numerischen Literal, und Es wird abgerundet und als Spaltennummer verwendet.

SELECT * FROM table ORDER BY 1.5 scheint nach dem Wert der ersten Spalte zu sortieren.