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

Oracle Discussion :

Problèmes de tri


Sujet :

Oracle

  1. #1
    Membre éclairé
    Inscrit en
    Septembre 2006
    Messages
    365
    Détails du profil
    Informations forums :
    Inscription : Septembre 2006
    Messages : 365
    Par défaut Problèmes de tri
    bonjour,

    j'ai un petit souci concernant le tri.
    en fait, je tri sur une colonne d'integer (positifs, négatifs ou nuls).

    quand je fais le tri normal (order by MaColonne) le tri marche parfaitement.

    par contre, quand j'ecris ca, cela ne marche plus (enfin ca marche sauf que j'ai les entiers négatifs toujours en extrémité et apparamment ils ne sont pas inclus dans le tri :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    SELECT t1.*
    FROM (SELECT ID, NUMERO, AVOIR FROM MyTable
    ORDER BY DECODE(:champTri, 'ID', ID, 'NUMERO', NUMERO, ID)) t1
    ORDER BY ROWNUM * (:sensTri)
    où champTri (string) et sensTri(integer) sont des variables que j'alimente ailleurs.

    Par ex, en l'occurrence pour l'exemple que je vous ai expliqué, pour sensTri=-1 et champTri = 'AVOIR', j'aurais le tri descendant sur la colonne AVOIR.
    Le pb est que pour des valeurs de la colonne AVOIRS comme suit:
    -10
    -5
    0
    10
    20
    ..
    j'aurai un tri descendant de la forme
    -10
    -5
    20
    10
    0

    je ne vois pas d'ou provient le souci du moment qu'un simple order by marche parfaitement, donc ce ne peut pas etre un problème de string et d'integer!
    j'ai essayé pour d'autres colonnes et ca marche très bien.. ya que les nombres négatifs qui foutent le b...

    Merci

  2. #2
    Expert éminent
    Avatar de orafrance
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    15 967
    Détails du profil
    Informations personnelles :
    Âge : 48
    Localisation : France

    Informations forums :
    Inscription : Janvier 2004
    Messages : 15 967
    Par défaut
    pourquoi trier sur ROWNUM ? ROWNUM c'est forcément dans l'ordre croissant puisque c'est le numéro de la ligne

  3. #3
    Membre émérite Avatar de plabrevo
    Profil pro
    Inscrit en
    Décembre 2005
    Messages
    548
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2005
    Messages : 548
    Par défaut
    Et sous cette forme ...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    SELECT rownum * SIGN(:sensTRI), t1.*
    FROM (SELECT ID, NUMERO, AVOIR FROM MyTable
    ORDER BY DECODE(:champTri, 'ID', ID, 'NUMERO', NUMERO, ID)) t1
    ORDER BY 1

  4. #4
    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
    J'avais lu ça dans le journal d'Oracle : Le TYPE du DECODE est celui de la premiere valeur. Soit ici le type de champTri : VARCHAR2
    Il va donc trier la chaine DECODE(:champTri, 'ID', ID, 'NUMERO', NUMERO, ID)
    comme du VARCHAR2.

    Chez moi par contre ça marche, j'ai les bons tris en faisant ta requete.

    Je te renvoies aussi sur la discussion des différences entre comparaison et tri.
    http://www.developpez.net/forums/sho...light=NLS_COMP

    Chez moi (9.2.0.1):
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    SELECT '-10'
    FROM dual
    UNION
    SELECT '0'
    FROM DUAL
    ORDER BY 1 
     
    => '0' puis '-10'
    A l'inverse
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    SELECT 1 FROM dual
    WHERE '0' > '-10'
     
    => 1

  5. #5
    Membre éclairé
    Inscrit en
    Septembre 2006
    Messages
    365
    Détails du profil
    Informations forums :
    Inscription : Septembre 2006
    Messages : 365
    Par défaut
    bon je sais ce qui cloche..
    c'est effectivement le decode!!

    en fait, :champtri est de type varchar2 (bien entendu car je fais le tri selon l'INTITULE de la colonne que je désire)
    le decode "croit" que toutes les colonnes que je lui envoie pour le tri sont de type varchar2.

    la solution serait de mettre les numéros de colonne au lieu des intitulés de colonnes, ce qui mettrait :champtri à integer et ca résout le pb, sauf que ce n'est pas du tout pratique car j'ai besoin de récupérer l'intitulé de la colonne et je ne vais pas imposer à l'utilisateur de connaitre tous les numéros de colonne!!

    voila..

    je suis allé sur le lien que tu m'as envoyé et je n'ai pas trouvé de traces sur le pb du decode..

  6. #6
    Membre Expert

    Homme Profil pro
    Chef de projet en SSII
    Inscrit en
    Janvier 2004
    Messages
    2 862
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Chef de projet en SSII
    Secteur : Conseil

    Informations forums :
    Inscription : Janvier 2004
    Messages : 2 862
    Par défaut
    Citation Envoyé par McM
    J'avais lu ça dans le journal d'Oracle : Le TYPE du DECODE est celui de la premiere valeur. Soit ici le type de champTri : VARCHAR2
    Non, je ne suis pas d'accord avec toi. C'est le type de la première valeur résultat qui est pris en compte, ici la colonne ID.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    SQL> desc table1
     Name                            Null?    Type
     ------------------------------- -------- ----
     A                                        NUMBER
     B                                        NUMBER
     
    SQL> create view vue_table1 as select decode ('b', 'a', a, 'b', b) tri from table1;
    View created.
     
    SQL> desc vue_table1
     Name                            Null?    Type
     ------------------------------- -------- ----
     TRI                                      NUMBER
    La première colonne du decode est bien de type varchar2, mais le type résultant est bien number car la colonne a est number.

    Maintenant si je fais :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    SQL> create view vue2_table1 as select decode ('b', 'a', 'toto', a, 'b', b) tri from table1;
    View created.
     
    SQL> desc vue2_table1 
     Name                            Null?    Type
     ------------------------------- -------- ----
     TRI                                      VARCHAR2(40)
    Ma colonne tri est désormais de type varchar2, car la première colonne résultat du decode est de type varchar2.

    [EDIT]
    Il est d'ailleurs intéressant de constater que cette conversion implicite faite par le decode n'est pas supportée par le case when :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    SQL>create view vue3_table1 as select (case when 'a' = 'a' then 'a' else b end) tri from table1;
    create view vue3_table1 as select (case when 'a' = 'a' then 'a' else b end) tri from table1
                                                                        *
    ERROR at line 1:
    ORA-00932: inconsistent datatypes: expected CHAR got NUMBER
    [/EDIT]

  7. #7
    Membre éclairé
    Inscrit en
    Septembre 2006
    Messages
    365
    Détails du profil
    Informations forums :
    Inscription : Septembre 2006
    Messages : 365
    Par défaut
    effectivement..
    après qqes tests, je suis arrivé au même résultat! c'est donc le type de la première valeur renvoyée à Decode comme tu dis!

    mais ca me renvoie tjs au même problème.

    j'ai des colonnes de type différent (integer, varchar2 et date)
    je veux faire un tri selon l'intitulé de la colonne en utilisant un decode, ce qui me fait:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    orderby decode(:champtri, Somme, 'Somme', Nom, 'Nom', Date, 'Date', Nom)
    où champtri est de type varchar2.

    aucune solution ne marche pour tous ces types en même temps.
    Meme en reseignant le numero
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    decode(:champtri, 1,1,2,2,3,3,1)
    où champtri est de type integer--> ca résout le pb des nombres mais pas celui des dates..

    est ce que qqn voit une solution?? ou même une suggestion.. merci

  8. #8
    Membre Expert

    Homme Profil pro
    Chef de projet en SSII
    Inscrit en
    Janvier 2004
    Messages
    2 862
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Chef de projet en SSII
    Secteur : Conseil

    Informations forums :
    Inscription : Janvier 2004
    Messages : 2 862
    Par défaut
    Personnellement je fais autant de decode que j'ai de type de données :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    select *
    from matable
    order by decode (:champTri, 'A', colNum1, 'B', colNum2),
             decode (:champTri, 'C', colDate1, 'D', colDate2),
             decode (:champTri, 'E', colChar1, colChar2);
    Une autre solution est de faire une requête dynamique.

  9. #9
    Membre éclairé
    Inscrit en
    Septembre 2006
    Messages
    365
    Détails du profil
    Informations forums :
    Inscription : Septembre 2006
    Messages : 365
    Par défaut
    et ça marche ton truc??

    j'ai essayé chez moi et j'ai toujours les mêmes soucis...

  10. #10
    Membre éclairé
    Inscrit en
    Septembre 2006
    Messages
    365
    Détails du profil
    Informations forums :
    Inscription : Septembre 2006
    Messages : 365
    Par défaut
    autant pour moi...
    ca marche très bien

    Merci bp..

    je pense que cela fera un bon post, surtout avec le sens de tri paramétrable que j'ai inclus au début..

    encore merci

  11. #11
    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
    Exact : Mea Culpa (mais j'avais lu ça il y a 3 ans, j'ai une excuse )

    Mais bon, Freesstyler a écrit :
    en fait, je tri sur une colonne d'integer (positifs, négatifs ou nuls).
    C'est pas exactement ça alors.
    Quel est le desc des champs du decode ?

  12. #12
    Membre éclairé
    Inscrit en
    Septembre 2006
    Messages
    365
    Détails du profil
    Informations forums :
    Inscription : Septembre 2006
    Messages : 365
    Par défaut
    c parce que j'ai essayé d'isoler le pb, alors qu'il ne s'agissait pas spécialement des integers, mais de n'importe quel autre type renseigné..

    donc il faut finalement autant de decode que de types!

    Merci pour la discussion, c'était très instructif!

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

Discussions similaires

  1. [MySQL] Problème de tri
    Par pounie dans le forum PHP & Base de données
    Réponses: 6
    Dernier message: 22/10/2005, 13h09
  2. Problème de tri avec analyse croisée
    Par drthodt dans le forum Access
    Réponses: 2
    Dernier message: 18/10/2005, 16h23
  3. [TToolBar] Problème de tri
    Par titiyo dans le forum Composants VCL
    Réponses: 6
    Dernier message: 01/09/2004, 09h21
  4. [Collections] Problème de tri
    Par feti2004 dans le forum Collection et Stream
    Réponses: 16
    Dernier message: 03/08/2004, 16h45
  5. problème de tri et optimisatiopn
    Par psyco2604 dans le forum XSL/XSLT/XPATH
    Réponses: 9
    Dernier message: 13/05/2004, 10h44

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