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

Langage SQL Discussion :

Tri personnalisé avec "order by"


Sujet :

Langage SQL

  1. #1
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    30
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 30
    Points : 36
    Points
    36
    Par défaut Tri personnalisé avec "order by"
    Bonjour,

    Sous Oracle j'ai une requête du genre :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT * FROM maTable ORDER BY code
    Le problème c'est que code est de la forme xxx où x est une lettre ou un chiffre et Oracle me trie ça avec les chiffres après les lettres alors que je voudrais l'inverse. Est-ce possible de faire ça directement en SQL ou bien faut-il obligatoirement retrier mes données dans mon client qui reçoit le résultat ?

    Merci de m'aider.

  2. #2
    Membre éclairé Avatar de methylene
    Profil pro
    Inscrit en
    Février 2010
    Messages
    659
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Février 2010
    Messages : 659
    Points : 813
    Points
    813
    Par défaut
    Bonjour

    Je ne crois pas qu'il y ai d'option pour cela.


    Si tu ne veux pas trier dans ton client, tu peux toujours faire des sous-requêtes jointes avec pour chaque sous-requête une condition sur le premier caractère (chiffre/lettre) et un tri. Tu Ne fait pas de trie sur le résultat de la requête globale et ça devrait marcher.
    Par contre ça va si c'est des petites tables parce que c'est vraiment pas optimisé :/
    Il y a surement des façons plus intelligentes de faire ça, je suis loin d'être un expert !

  3. #3
    Membre habitué
    Inscrit en
    Mai 2010
    Messages
    107
    Détails du profil
    Informations forums :
    Inscription : Mai 2010
    Messages : 107
    Points : 132
    Points
    132
    Par défaut
    Hello,

    Si je peux me permettre, tu peux manipuler ta chaine de caractère avant de trier;

    Un petit code d'exemple:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    WITH T1 AS 
     (
       SELECT '1ABC' AS A FROM DUAL UNION ALL
       SELECT '2NBC' FROM DUAL UNION ALL
       SELECT '2CNN' FROM DUAL UNION ALL
       SELECT '9SCI' FROM DUAL
    )
    SELECT A, REVERSE(A) B, SUBSTR(A, 2) C, SUBSTR(A, 2) || SUBSTR(A, 1, 1) D 
      FROM T1 
     ORDER BY D;
    Devrait te produire un résultat comme celui-ci

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    A    B    C   D    
    ---- ---- --- ---- 
    1ABC CBA1 ABC ABC1 
    2CNN NNC2 CNN CNN2 
    2NBC CBN2 NBC NBC2 
    9SCI ICS9 SCI SCI9
    Le résultat est triée sur la dernière colonne (la colonne D).

    N'hésite pas à me contacter si tu ne comprends pas bien.

    Bien à toi,

  4. #4
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    30
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 30
    Points : 36
    Points
    36
    Par défaut
    Citation Envoyé par methylene Voir le message
    Si tu ne veux pas trier dans ton client, tu peux toujours faire des sous-requêtes jointes avec pour chaque sous-requête une condition sur le premier caractère (chiffre/lettre) et un tri. Tu Ne fait pas de trie sur le résultat de la requête globale et ça devrait marcher.
    Je comprends pas comment faire les sous-requêtes. Quelle condition mettre ?
    Sachant que les codes ont la forme AB4, B7T, 97H...

    Et pour les perfs ma table a 3500 éléments avec 5 colonnes chacun.

  5. #5
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    30
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 30
    Points : 36
    Points
    36
    Par défaut
    Citation Envoyé par OracleFan Voir le message
    N'hésite pas à me contacter si tu ne comprends pas bien.
    Je ne suis pas sûr que ça répond à mon problème. Le code ne doit pas changer. Je veux récupérer tous les éléments de ma table triées par leur code comme ceci :

    ... ZA8, ZA9, ZAA, ZAB ... ZAZ, ZB0, ZB1 ...
    et non
    ... ZA8, ZA9, ZBA, ZBB, ... ZBZ, ZB0, ZB1...

  6. #6
    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
    Points : 18 395
    Points
    18 395
    Par défaut
    Citation Envoyé par methylene Voir le message
    Je ne crois pas qu'il y ai d'option pour cela.
    Vous aviez une chance sur deux mais c'est perdu !

    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
    With MaTable AS
    (
    select 1 as nm, '1ABC' as nom from dual union all
    select 2      , '2BCD'        from dual union all
    select 3      , 'CDE3'        from dual union all
    select 4      , 'DEF4'        from dual
    )
      select nm, nom
        from MaTable
    order by nom asc;
     
    NM	NOM
    3	CDE3
    4	DEF4
    1	1ABC
    2	2BCD

    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
    With MaTable AS
    (
    select 1 as nm, '1ABC' as nom from dual union all
    select 2      , '2BCD'        from dual union all
    select 3      , 'CDE3'        from dual union all
    select 4      , 'DEF4'        from dual
    )
      select nm, nom
        from MaTable
    order by nlssort(nom, 'nls_sort=Binary') asc;
     
    NM	NOM
    1	1ABC
    2	2BCD
    3	CDE3
    4	DEF4

  7. #7
    Membre habitué
    Inscrit en
    Mai 2010
    Messages
    107
    Détails du profil
    Informations forums :
    Inscription : Mai 2010
    Messages : 107
    Points : 132
    Points
    132
    Par défaut
    Citation Envoyé par Deamon Voir le message
    Je ne suis pas sûr que ça répond à mon problème. Le code ne doit pas changer. Je veux récupérer tous les éléments de ma table triées par leur code comme ceci :

    ... ZA8, ZA9, ZAA, ZAB ... ZAZ, ZB0, ZB1 ...
    et non
    ... ZA8, ZA9, ZBA, ZBB, ... ZBZ, ZB0, ZB1...

    Okay, désolé, j'avais pas bien saisi le problème.
    Je pensais que tu avais un code comme '1ABC' et que tu voulais mettre le chiffre après les lettres.

    La solution de Waldar fera l'affaire alors :-)

  8. #8
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    30
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 30
    Points : 36
    Points
    36
    Par défaut
    Merci Waldar c'est exactement ce que je voulais. Merci à tous.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. tri personnalisé avec rupture
    Par etu_multi dans le forum Webi
    Réponses: 0
    Dernier message: 02/10/2012, 22h59
  2. Select et insert avec des caracteres speciaux (quote ')
    Par Paco75 dans le forum Requêtes
    Réponses: 2
    Dernier message: 25/10/2006, 15h59
  3. Probleme avec encodage de simple quote
    Par linkowich dans le forum Langage
    Réponses: 2
    Dernier message: 31/10/2005, 14h16
  4. Réponses: 3
    Dernier message: 30/06/2005, 13h50

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