ORDER BY DECODE(BLAH, [Spaltennummer]) auf einer einzigen Spalte der Abfrage.Wie funktioniert es?

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

  •  21-09-2019
  •  | 
  •  

Frage

Hallo ich brauche Hilfe, um zu verstehen, die decode-Teil einer Abfrage, die geht etwas wie das folgende.

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 gibt nur 1 Abfrage, ich bin ein wenig ratlos, wie die ORDER BY-arbeiten mit den verschiedenen nicht-vorhandenen Spalte zahlen geliefert DECODIEREN.Die Abfrage funktioniert als cursor zu finden, ein eindeutiger code, der für die betreffenden Tiere gegeben, ein Tier mnemonische der aktuellen Tier-Typ und den Typ abgestimmt werden.

Ich denke, dass DEKODIEREN, gibt die andere Spalte die zahlen zur BESTELLUNG mit und ich habe versucht, zu Experimentieren mit einem anderen einfachen Spalte wählt auf einige andere Tabellen mit ORDER by '-1', '0' und '100' - und die ORDER by-scheint nicht für das 0 und 100.Warum funktioniert es mit -1 oder eine der anderen zahlen?

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

War es hilfreich?

Lösung

Es schafft die Menge, die für die Bestellung verwendet werden.

Wenn animal_type l_type_to_be_matched = Verwenden Sie eine -1 als Sortierwert für diese Zeile
wenn sonst animal_type = l_current_type, Verwendung 0 als Sortierwert dieser Zeile
else if axt.type_search_priority 100 als Sortierwert dieser Zeile
null dann verwenden sonst Verwendung axt.type_search_priority als Sortierwert für diese Zeile.

Es gibt eine Art bedingter Art cirteria. Oft verwendet, um sicherzustellen, dass bestimmte Elemente immer an der oberen oder unteren Rand einer sortierten Satz sind.

Andere Tipps

Die BESTELLUNG kann DURCH Verwendung eines der drei Ausdrücke.Erstens ein alias der select-Liste, zweitens, die Anzahl der Spalte in der select-Liste oder drittens einen SQL-Ausdruck an, die möglicherweise null oder mehr Spalten der Quelltabellen.

So, wenn Sie verwenden ORDER BY SUBSTR(col,2,10) für Bestellungen innerhalb von 10 Zeichen Teilstring der Wert der Spalte ab dem zweiten Zeichen.

Ähnlich, wenn Sie verwenden

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

übersetzen Sie HUND in den Wert 1, CAT in Wert 2, AAL in Wert 3 und die andere in Wert 5.Dann, um durch die daraus resultierenden numerischen Wert (ie ersten HUND, dann die KATZE, dann ein AAL, schließlich irgendetwas anderes).

Erzielen Sie gleichzeitig mit der Bestellung

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

zu diesem Teil Ihrer Frage Bezug:

  

Ich denke, dass DECODE kehrt die   verschiedene Spaltennummern ORDER BY   mit und ich mit einem bewährten experimentieren   verschiedene einfache einzelne Spalte wählt   auf einigen anderen Tabellen mit ORDER BY   ‚-1‘, ‚0‘ und ‚100‘ und die Reihenfolge von   scheint für 0 und 100. zu scheitern Warum   es funktioniert mit -1 oder eine der anderen   Zahlen?

Ihre Verwirrung ist verständlich; aber nein, die von den DECODE zurückgegebenen Werte werden nicht als Spaltennummern interpretiert.

Oracle unterstützt eine kleine syntaktische Verknüpfung, in der die Spalten der Ergebnismenge kann in einer ORDER BY-Klausel positionell bezeichnet werden. 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

Dies ist jedoch Stellenschreibweise kann nur mit nicht-negativen Ganzzahlliterale erfolgen. Wenn die ORDER BY einen Ausdruck enthält, die einen numerischen Wert erzeugt, wird es nicht als Spaltennummer interpretiert werden, sondern als einen tatsächlichen Wert zu sortier auf. Auch negative Zahlenliterale werden interpretiert als Sortierwert, nicht als Spaltennummern.

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 ist.

SELECT * FROM table ORDER BY 1 wird alle Zeilen auf dem Wert der ersten Spalte in der Tabelle sortiert werden.

SELECT * FROM table ORDER BY 100 werden alle Zeilen auf den Wert der 100. Spalte in der Tabelle sortieren, oder einen Fehler zurück, wenn es weniger als 100 Spalten.

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

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

SELECT * FROM table ORDER BY 1.5 erscheint auf dem Wert der ersten Spalte zu sortieren.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top