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 26/01/2007, 16h45   #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 tri numérique sur varchar

bonjour,
j'ai une liste de valeurs à trier
ma colonne c'est du varchar2, mais je veux que le tri soit significatif.
ex:
1
-10
11
2
23
alors qu'évidemment je veux:
1
2
10
11
23

j'ai trouvé un post qui y ressemble mais le cast
Code :
ORDER BY CAST(lacolonne AS UNSIGNED)
ne fonctionne pas du tout (oralce9)
freestyler est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 26/01/2007, 16h51   #2
Responsable Business Intelligence
 
Avatar de kalyparker
 
Femme
Consultant en Business Intelligence
Inscription : janvier 2007
Messages : 1 192
Détails du profil
Informations personnelles :
Sexe : Femme
Localisation : France

Informations professionnelles :
Activité : Consultant en Business Intelligence

Informations forums :
Inscription : janvier 2007
Messages : 1 192
Points : 2 564
Points : 2 564
Bonjour,

pourquoi ne pas utiliser un to_number ?
kalyparker est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 26/01/2007, 16h53   #3
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
Tu n'as QUE des nombres dans ce varchar2 ?
Si oui tu fais un
Code :
ABS(TO_NUMBER(lacolonne))
McM est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 26/01/2007, 16h54   #4
Membre du Club
 
Inscription : septembre 2006
Messages : 339
Détails du profil
Informations forums :
Inscription : septembre 2006
Messages : 339
Points : 47
Points : 47
bien vu
c juste que j'ai d'autres valeurs non numériques la dedans!! (des tirets), donc je veux ca en fait:

-
-
-
-
1
2
11
12
20
21
etc..


)
freestyler est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 26/01/2007, 17h01   #5
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
Tout dépend comment tu veux trier !!
Le numérique avant le char ou après ou au milieu ?

Tu as dit : -10 je veux le trier en 10

Si tu as '9A2', tu le mets où ?

Bref, précise ta demande.

Edit :
J'ai relu, tu dis avoir d'autres valeurs non numériques (des tirets).
Si j'ai bien suivi, tu as soit les caractères "0" à "9" et les "-"
McM est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 26/01/2007, 17h06   #6
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
Au pire pour trier des champs nombres/caract dans un VARCHAR2 avec les nb en premier et les chars ensuite, voici un code (attention, le with c'est du 10 pour un test, faut prendre juste le select)
Code :
1
2
3
4
5
6
7
8
WITH r AS (SELECT '-10' AS t FROM dual)
SELECT DECODE( LTRIM(SUBSTR(t, DECODE(ASCII(t), 45, 2, 1)), '0123456789'), NULL, 
			TO_NUMBER(t), NULL) AS num_t,
	DECODE( LTRIM(SUBSTR(t, DECODE(ASCII(t), 45, 2, 1)), '0123456789'), NULL, NULL, t) AS char_t, 
		t
FROM r
ORDER BY 1, 2 -- Num puis Char 
ORDER BY 2, 1 -- Char puis num
McM est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 26/01/2007, 17h08   #7
Membre du Club
 
Inscription : septembre 2006
Messages : 339
Détails du profil
Informations forums :
Inscription : septembre 2006
Messages : 339
Points : 47
Points : 47
j'ai que des numériques (négatifs ou positifs) et des tirets.. c tout!
freestyler est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 26/01/2007, 17h14   #8
Membre du Club
 
Inscription : septembre 2006
Messages : 339
Détails du profil
Informations forums :
Inscription : septembre 2006
Messages : 339
Points : 47
Points : 47
je ne vois comment adapter ton code!! pour une colonne donnée!
freestyler est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 26/01/2007, 18h06   #9
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
Code :
1
2
3
SELECT DECODE(col, '-', '-', LTRIM(col, '-')) AS visu_col
FROM t
ORDER BY DECODE(col, '-', -1, TO_NUMBER(LTRIM(col, '-')))
affiche les '-' uniques puis les nombres en valeur absolue
McM est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 29/01/2007, 14h31   #10
Membre du Club
 
Inscription : septembre 2006
Messages : 339
Détails du profil
Informations forums :
Inscription : septembre 2006
Messages : 339
Points : 47
Points : 47
oui merci..
ca marche!

j'ai même trouvé comment faire mieux et beaucoup plus simple
(je récupère mes valeurs numériques dans une colonne à part COL et je fais un select dans un autre select - le select du milieu se charge de faire le tri sur COL (integer), et le select extérieur se charge de reconstituer ma colonne en ORIGINAL_COL(varchar2) et ca marche très bien)

Le pb avec ton code c'est que tu remplaces les (-) par des (-1)logiques pour faire le tri, sauf que je veux garder les valeurs signées dans ma liste, du coup je remplace -1 par -10000 ou plus (en valeur absolue) ou idéalement par [-1*(select max(COL) from MyTable)] mais pour ce cas, la requete prend considérablement plus de temps!

voila..
freestyler est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 29/01/2007, 17h53   #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
Purée, t'es pas précis toi !!
Citation:
j'ai une liste de valeurs à trier
ma colonne c'est du varchar2, mais je veux que le tri soit significatif.
ex:
1
-10
11
2
23
alors qu'évidemment je veux:
1
2
10
11
23
Il y a un moyen de trier en premier les '-' et ensuite les autres
Code :
ORDER BY decode(col, '-', 0, 1), le_tri_nombre_qui_marche
McM est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 30/01/2007, 13h56   #12
Expert Confirmé Sénior


 
Avatar de laurentschneider
 
Homme Laurent Schneider
Administrateur de base de données
Inscription : décembre 2005
Messages : 2 927
Détails du profil
Informations personnelles :
Nom : Homme Laurent Schneider
Localisation : Suisse

Informations professionnelles :
Activité : Administrateur de base de données
Secteur : Finance

Informations forums :
Inscription : décembre 2005
Messages : 2 927
Points : 4 549
Points : 4 549
Code :
1
2
 order by decode(n,'-',-1e125,abs(to_number(n)))
laurentschneider est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 30/01/2007, 13h59   #13
Expert Confirmé Sénior


 
Avatar de laurentschneider
 
Homme Laurent Schneider
Administrateur de base de données
Inscription : décembre 2005
Messages : 2 927
Détails du profil
Informations personnelles :
Nom : Homme Laurent Schneider
Localisation : Suisse

Informations professionnelles :
Activité : Administrateur de base de données
Secteur : Finance

Informations forums :
Inscription : décembre 2005
Messages : 2 927
Points : 4 549
Points : 4 549
ou, plus robuste :
Code :
1
2
 
ORDER BY ltrim(REPLACE(n,'-'),8) nulls first
laurentschneider 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 20h28.


 
 
 
 
Partenaires

Hébergement Web