IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

PL/SQL Oracle Discussion :

order by decode ou case


Sujet :

PL/SQL Oracle

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Inscrit en
    Décembre 2007
    Messages
    122
    Détails du profil
    Informations forums :
    Inscription : Décembre 2007
    Messages : 122
    Par défaut order by decode ou case
    Salut, je suis sous Oracle 10G,

    J'ai deux possibilités de tri et je veux mettre ça dans un ORDER BY.

    Je dois utiliser un DECODE ou bien un CASE ?
    Ma variable est V_ORDRE.

    Les deux ne fonctionnent pas à cause je crois du ORDER BY sur plusieurs colonnes et non sur juste une.

    Auriez-vous une solution ?
    Je dois faire un ORDER BY sur quelques colonnes de la table selon V_ORDRE :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    SELECT * FROM ABC
    WHERE ID = V_ID
    ORDER BY DECODE(V_ORDRE,1, (NO_EMP, NO_SOCIAL, ADRESSE)
                              V_ORDRE,2, (NO_SOCIAL, NOM, PRENOM)
    Ou bien :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    SELECT * FROM ABC
    WHERE ID = V_ID
    ORDER BY CASE
                  V_ORDRE = 1 THEN (NO_EMP, NO_SOCIAL, ADRESSE)
                  V_ORDRE = 2 THEN (NO_SOCIAL, NOM, PRENOM)
                  END
    Merci beaucoup !

  2. #2
    Invité
    Invité(e)
    Par défaut
    http://sheikyerbouti.developpez.com/...e=Chap3#DECODE
    ==> Substitution valeur par valeur

    Dans votre cas, vous le faite avec plusieurs champs, c'est pour ça que ça plante.

    Essayez plutôt quelque chose dans ce goût : (je n'ai pas testé)


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    SELECT * FROM ABC
    WHERE ID = V_ID
    ORDER BY CASE
                  V_ORDRE = 1 THEN NO_EMP
                  V_ORDRE = 2 THEN NO_SOCIAL
                  END,
     
    CASE
                  V_ORDRE = 1 THEN NO_SOCIAL
                  V_ORDRE = 2 THEN NOM
                  END,
     
    CASE
                  V_ORDRE = 1 THEN ADRESSE
                  V_ORDRE = 2 THEN PRENOM
                  END

  3. #3
    Modérateur
    Avatar de Waldar
    Homme Profil pro
    Sr. Specialist Solutions Architect @Databricks
    Inscrit en
    Septembre 2008
    Messages
    8 454
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Sr. Specialist Solutions Architect @Databricks
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2008
    Messages : 8 454
    Par défaut
    Ne pas oublier les WHEN dans l'instruction CASE :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
      SELECT *
        FROM ABC
       WHERE ID = V_ID
    ORDER BY CASE V_ORDRE
               WHEN 1 THEN NO_EMP
               WHEN 2 THEN NO_SOCIAL
             END ASC,
             CASE V_ORDRE
               WHEN 1 THEN NO_SOCIAL
               WHEN 2 THEN NOM
             END ASC,
             CASE V_ORDRE
               WHEN 1 THEN ADRESSE
               WHEN 2 THEN PRENOM
             END ASC;

  4. #4
    Invité
    Invité(e)
    Par défaut
    Citation Envoyé par Waldar Voir le message
    Ne pas oublier les WHEN dans l'instruction CASE
    Effectivement ! Merci.

  5. #5
    Membre confirmé
    Inscrit en
    Décembre 2007
    Messages
    122
    Détails du profil
    Informations forums :
    Inscription : Décembre 2007
    Messages : 122
    Par défaut
    Une autre possibilité.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    ORDER BY decode( v_ordre,1, pues.ul_annee_financier || pues.ul_no_contrat 
                                                           || pues.ul_anc_compte 
                                                           || pues.emplid 
                                                           || ppda.name
                               ,2, pues.ul_no_contrat || pues.ul_annee_financier 
                                                      || pues.ul_anc_compte 
                                                      || pues.emplid 
                                                      || ppda.name);

  6. #6
    Invité
    Invité(e)
    Par défaut
    Citation Envoyé par Marcel Chabot Voir le message
    Une autre possibilité.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    ORDER BY decode( v_ordre,1, pues.ul_annee_financier || pues.ul_no_contrat 
                                                           || pues.ul_anc_compte 
                                                           || pues.emplid 
                                                           || ppda.name
                               ,2, pues.ul_no_contrat || pues.ul_annee_financier 
                                                      || pues.ul_anc_compte 
                                                      || pues.emplid 
                                                      || ppda.name);
    Ça m'étonnerait que ce procédé soit équivalent. Une concaténation de champs dépend de la longueur des champs.
    Et au niveau de la performance, ça doit pas être terrible non plus.

  7. #7
    McM
    McM est déconnecté
    Expert confirmé

    Homme Profil pro
    Développeur Oracle
    Inscrit en
    Juillet 2003
    Messages
    4 580
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur Oracle

    Informations forums :
    Inscription : Juillet 2003
    Messages : 4 580
    Billets dans le blog
    4
    Par défaut
    Ne JAMAIS tester des concaténations sans séparateur !

    Parce que 1,2,'a' serait supérieur à 11,999,'z'

Discussions similaires

  1. order by sur un case when HQL
    Par ekremyilmaz dans le forum Hibernate
    Réponses: 2
    Dernier message: 04/01/2011, 11h12
  2. GroupBy, Decode et Case
    Par kewee dans le forum SQL
    Réponses: 1
    Dernier message: 10/12/2008, 10h59
  3. decode avec case
    Par moulery dans le forum SQL
    Réponses: 3
    Dernier message: 29/02/2008, 11h37
  4. Réponses: 2
    Dernier message: 15/05/2006, 14h08
  5. [SQL] performances Decode ou Case when ?
    Par Yorglaa dans le forum Oracle
    Réponses: 8
    Dernier message: 01/10/2004, 15h50

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo