COMMANDE PAR DECODE(BLA, [NUMÉRO de COLONNE]) sur une seule colonne de la requête. Comment ça fonctionne?
Salut, j'ai besoin d'aide pour comprendre le décoder une partie 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
Depuis cette requête ne retourne qu'1 de la requête, je suis un peu perplexe sur la façon dont l'ORDRE PAR les œuvres avec les différents non-existant colonne de chiffres fournis par les DÉCODER. La requête fonctionne comme un curseur pour trouver un code unique pour l'animal en question et compte tenu d'un animal mnémonique de l'animal en cours type et le type à être mis en correspondance avec.
Je pense que DÉCODER retourne les différents numéros de colonne à l'ORDRE PAR avec et j'ai essayé d'expérimenter avec un autre simple à une seule colonne sélectionne sur certains autres tables avec la COMMANDE par '-1', '0' et '100' et la COMMANDE par semble échouer pour 0 et 100. Pourquoi faut-il travailler avec -1 ou l'un des autres numéros?
Espère que quelqu'un peut-il m'expliquer cela. Merci!
OriginalL'auteur Azeworai | 2010-02-19
Vous devez vous connecter pour publier un commentaire.
Il crée le jeu qui sera utilisé pour la commande.
Si animal_type = l_type_to_be_matched, utiliser un -1 comme valeur de tri pour cette ligne
sinon si animal_type = l_current_type, utiliser 0 comme valeur de tri de la ligne
sinon si axt.type_search_priority est null alors utiliser 100 comme le type de la valeur de la ligne
d'autre axt.type_search_priority comme le type de la valeur de cette ligne.
Il donne une sorte de mise critères de tri. Souvent utilisé pour s'assurer que certains éléments sont toujours en haut ou en bas d'un ensemble trié.
oui, c'est l'idée. Voici un autre post que décrit à faire la même chose: orindasoft.com/public/blog/2007/07/oracles-decode-funtion.html
OriginalL'auteur Doug Porter
La COMMANDE PAR pouvez utiliser l'une des trois expressions.
Tout d'abord un alias de la liste de sélection, d'autre part le nombre de colonne dans la liste de sélection ou, troisièmement, une expression SQL qui peuvent être de zéro, une ou plusieurs colonnes dans les tables source.
Ainsi, lorsque vous utilisez
COMMANDE PAR SUBSTR(col,2,10)
vous commandez par une sous-chaîne de 10 caractères de la valeur de la colonne à partir de la deuxième personnage.
De la même manière lors de l'utilisation
vous se traduire par "CHAT" dans la valeur 1, le CHIEN dans la valeur 2 et de l'ANGUILLE dans la valeur 3, l'ordre par la valeur numérique (ie CHIEN d'abord, puis de CHAT, puis de l'ANGUILLE, enfin autre chose).
Vous pouvez obtenir la même commande à l'aide de
OriginalL'auteur Gary Myers
Se référant à cette partie de votre question:
Votre confusion est compréhensible; mais non, les valeurs retournées par le DÉCODAGE ne sont pas interprétées comme des numéros de colonne.
Oracle prend en charge un peu raccourci syntaxique, dans les colonnes du jeu de résultats peuvent être soumises à une position dans une clause ORDER BY. Ainsi, par exemple ceci:
est la même chose que:
Cependant, cette notation de position ne peut être fait avec un entier non négatif littéraux. Si la COMMANDE PAR inclut une expression qui produit une valeur numérique, il ne sera pas interprétée comme un numéro de colonne, mais comme une valeur réelle d'être triées. Aussi, négatif littéraux numériques sont interprétées comme des valeurs de tri, non pas comme des numéros de colonne.
SELECT * FROM table ORDER BY -1
permettra de trier toutes les lignes sur la valeur de la constante -1 (pas de tri).SELECT * FROM table ORDER BY 0
retournera une erreur parce que 0 est un numéro de colonne non valide.SELECT * FROM table ORDER BY 1
permettra de trier toutes les lignes sur la valeur de la première colonne dans la table.SELECT * FROM table ORDER BY 100
permettra de trier toutes les lignes sur la valeur de la 100e édition de la colonne dans la table, ou renvoyer une erreur si il y a moins de 100 colonnes.SELECT * FROM table ORDER BY TO_NUMBER('1')
permettra de trier toutes les lignes sur la valeur de la constante 1.Je n'ai pas testé à fond, mais en regardant certains plans d'exécution, il apparaît que vous pouvez même spécifier un non-entier littéral numérique, et il sera arrondi vers le bas et utilisé comme un numéro de colonne.
SELECT * FROM table ORDER BY 1.5
apparaît pour trier sur la valeur de la première colonne.OriginalL'auteur Dave Costa