ORDER BY DECODE (BLA, [numéro de colonne]) sur une seule requête de colonne. Comment ça marche?

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

  •  21-09-2019
  •  | 
  •  

Question

Salut je besoin d'aide pour comprendre la partie de décodage d'une requête qui va quelque chose comme ce qui suit.

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

Étant donné que cette requête renvoie seulement 1 requête, je suis un peu perplexe sur la façon dont ORDER BY travaux avec les différents numéros de colonne non existants fournis par Decode. La requête fonctionne comme un curseur pour trouver un code unique pour l'animal en question étant donné un animal mnemonic le type d'animal en cours et le type à être adapté avec.

Je pense que DECODE renvoie les différents numéros de colonne à trier avec et moi avons essayé d'expérimenter avec une seule colonne simple, différente sur d'autres sélectionne les tables avec commande par « -1 », « 0 » et « 100 » et Classez par semble échouer pour 0 et 100. Pourquoi faut-il travailler avec -1 ou l'un des autres numéros?

quelqu'un L'espoir peut me l'expliquer. Merci!

Était-ce utile?

La solution

Il crée l'ensemble qui sera utilisé pour la commande.

Si animal_type = l_type_to_be_matched, utilisez -1 comme la valeur de tri pour cette ligne
else if = animal_type l_current_type, utilisez 0 comme valeur de tri de cette ligne
d'autre si axt.type_search_priority est nul alors utiliser 100 comme la valeur de tri de cette ligne
autre utilisation axt.type_search_priority que la valeur de tri pour cette ligne.

Il donne une sorte de condition de tri critères justifiant. Souvent utilisé pour faire en sorte que certains éléments sont toujours en haut ou en bas d'un ensemble trié.

Autres conseils

La ORDER BY peut utiliser l'une des trois expressions. Tout d'abord un alias de la liste de sélection, d'autre part le nombre d'une colonne dans la liste de sélection ou enfin une expression SQL qui peut utiliser zéro ou plusieurs colonnes des tables source.

Ainsi, lorsque vous utilisez ORDER BY substr (col, 2,10) vous commandez par une sous-chaîne de 10 caractères de la valeur de la colonne à partir du second caractère.

De même lorsque l'utilisation

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

vous traduisez chien dans la valeur 1, CAT en valeur 2, EEL en valeur 3 et d'autres en valeur 5. Ensuite, l'ordre de la valeur numérique résultante (c.-à-DOG d'abord, puis CAT, puis EEL, enfin quoi que ce soit d'autre).

Vous pouvez obtenir le même ordre en utilisant

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

En référence à cette partie de votre question:

  

Je pense que DECODE renvoie le   différents numéros de colonne pour commander par   avec et moi avons essayé d'expérimenter avec   différents simples de colonne unique sélectionne   sur d'autres tableaux à l'ordre de   « -1 », « 0 » et « 100 » et la commande par   semble échouer pour 0 et 100. Pourquoi   il fonctionne avec -1 ou l'un des autres   chiffres?

Votre confusion est compréhensible; mais non, les valeurs renvoyées par la DECODE ne sont pas interprétées comme des nombres de colonnes.

Oracle prend en charge un petit raccourci syntaxique, dans lequel les colonnes du jeu de résultats peuvent être appelés positionnelle dans une clause ORDER BY. Ainsi, par exemple ceci:

SELECT a, b FROM some_table ORDER BY 1,2

est le même que:

SELECT a, b FROM some_table ORDER BY a,b

Cependant, cette notation de position ne peut être fait avec des littéraux entiers non négatifs. Si la clause ORDER BY comprend une expression qui produit une valeur numérique, il ne sera pas interprété comme un numéro de colonne, mais comme une valeur réelle à trier sur. En outre, les littéraux numériques négatives sont interprétées comme des valeurs de tri, et non comme des numéros de colonne.

SELECT * FROM table ORDER BY -1 va trier toutes les lignes sur la valeur constante -1 (effectivement pas de tri).

SELECT * FROM table ORDER BY 0 retourne une erreur car 0 est un numéro de colonne non valide.

SELECT * FROM table ORDER BY 1 triera toutes les lignes sur la valeur de la première colonne du tableau.

SELECT * FROM table ORDER BY 100 triera toutes les lignes sur la valeur de la 100 e colonne de la table, ou retourner une erreur s'il y a moins de 100 colonnes.

SELECT * FROM table ORDER BY TO_NUMBER('1') triera toutes les lignes sur la valeur constante 1.

Je n'ai pas testé à fond, mais en regardant des plans d'exécution, il semble que vous pouvez même spécifier un littéral numérique non entier, et il sera arrondi et utilisé comme numéro de colonne.

SELECT * FROM table ORDER BY 1.5 semble trier sur la valeur de la première colonne.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top