Précédent   Forum des professionnels en informatique > Bases de données > Oracle
Oracle Forum Oracle : le serveur, les outils, ... Voir F.A.Q Oracle Tutoriels Oracle
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 23/01/2007, 15h18   #1
Membre du Club
 
Inscription : septembre 2006
Messages : 339
Détails du profil
Informations forums :
Inscription : septembre 2006
Messages : 339
Points : 47
Points : 47
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 :
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
freestyler est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 23/01/2007, 16h24   #2
Rédacteur/Modérateur
 
Avatar de orafrance
 
Inscription : janvier 2004
Messages : 15 861
Détails du profil
Informations personnelles :
Âge : 35

Informations forums :
Inscription : janvier 2004
Messages : 15 861
Points : 16 212
Points : 16 212
pourquoi trier sur ROWNUM ? ROWNUM c'est forcément dans l'ordre croissant puisque c'est le numéro de la ligne
orafrance est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 23/01/2007, 19h56   #3
Membre expérimenté

 
Avatar de plabrevo
 
Inscription : décembre 2005
Messages : 541
Détails du profil
Informations forums :
Inscription : décembre 2005
Messages : 541
Points : 598
Points : 598
Et sous cette forme ...

Code :
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
plabrevo est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 23/01/2007, 22h08   #4
McM
Expert Confirmé Sénior
 
Inscription : juillet 2003
Messages : 3 450
Détails du profil
Informations forums :
Inscription : juillet 2003
Messages : 3 450
Points : 4 209
Points : 4 209
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 :
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 :
1
2
3
4
SELECT 1 FROM dual
WHERE '0' > '-10'
 
=> 1
McM est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 24/01/2007, 14h35   #5
Membre du Club
 
Inscription : septembre 2006
Messages : 339
Détails du profil
Informations forums :
Inscription : septembre 2006
Messages : 339
Points : 47
Points : 47
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..
freestyler est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 24/01/2007, 15h09   #6
Expert Confirmé
 
Homme
Chef de projet en SSII
Inscription : janvier 2004
Messages : 2 866
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 866
Points : 3 448
Points : 3 448
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 :
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 :
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 :
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]
__________________
Un problème sans solution est un problème mal posé

Merci de poser vos questions sur le forum, je ne réponds pas aux questions posées par MP.
plaineR est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 24/01/2007, 15h25   #7
Membre du Club
 
Inscription : septembre 2006
Messages : 339
Détails du profil
Informations forums :
Inscription : septembre 2006
Messages : 339
Points : 47
Points : 47
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 :
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 :
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
freestyler est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 24/01/2007, 15h45   #8
Expert Confirmé
 
Homme
Chef de projet en SSII
Inscription : janvier 2004
Messages : 2 866
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 866
Points : 3 448
Points : 3 448
Personnellement je fais autant de decode que j'ai de type de données :
Code :
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.
__________________
Un problème sans solution est un problème mal posé

Merci de poser vos questions sur le forum, je ne réponds pas aux questions posées par MP.
plaineR est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 24/01/2007, 15h55   #9
Membre du Club
 
Inscription : septembre 2006
Messages : 339
Détails du profil
Informations forums :
Inscription : septembre 2006
Messages : 339
Points : 47
Points : 47
et ça marche ton truc??

j'ai essayé chez moi et j'ai toujours les mêmes soucis...
freestyler est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 24/01/2007, 15h59   #10
Membre du Club
 
Inscription : septembre 2006
Messages : 339
Détails du profil
Informations forums :
Inscription : septembre 2006
Messages : 339
Points : 47
Points : 47
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
freestyler est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 24/01/2007, 16h25   #11
McM
Expert Confirmé Sénior
 
Inscription : juillet 2003
Messages : 3 450
Détails du profil
Informations forums :
Inscription : juillet 2003
Messages : 3 450
Points : 4 209
Points : 4 209
Exact : Mea Culpa (mais j'avais lu ça il y a 3 ans, j'ai une excuse )

Mais bon, Freesstyler a écrit :
Citation:
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 ?
McM est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 24/01/2007, 16h59   #12
Membre du Club
 
Inscription : septembre 2006
Messages : 339
Détails du profil
Informations forums :
Inscription : septembre 2006
Messages : 339
Points : 47
Points : 47
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!
freestyler est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 00h32.


 
 
 
 
Partenaires

Hébergement Web