Précédent   Forum des professionnels en informatique > Bases de données > PostgreSQL
PostgreSQL Forum PostgreSQL. Avant de poster -> F.A.Q PostGreSQL Tutoriels PostGreSQL
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 14/08/2007, 21h11   #1
Invité de passage
 
Inscription : août 2007
Messages : 2
Détails du profil
Informations forums :
Inscription : août 2007
Messages : 2
Points : 1
Points : 1
Par défaut Tri varchar contenant des nombres et des lettres

Bonjour,
je désire trier les résultats en fonction du champ "valeur" de ma table. Si je fais un simple ORDER BY valeur, il me retourne les nombres classés selon leur longueur (1, 10, 100, 2, 20,...), or j'aimerais avoir les nombres dans l'ordre 1, 2, 10, 20, 100,...
Par contre, si je convertis ces nombres en INT, ça marche :
Code :
1
2
 
SELECT * FROM objets ORDER BY CAST ( valeur AS INT )
Le petit problème est que ce champ ne va pas forcément contenir QUE des nombres, et dans ce cas ça ne fonctionne plus.
Y a-t-il un moyen simple de faire ce tri correctement ? Ou bien dois-je le programmer du côté de l'application ?
ben106 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 15/08/2007, 10h46   #2
Expert Confirmé
 
Homme
Inscription : septembre 2006
Messages : 2 293
Détails du profil
Informations personnelles :
Sexe : Homme

Informations forums :
Inscription : septembre 2006
Messages : 2 293
Points : 2 741
Points : 2 741
Citation:
Envoyé par ben106
Bonjour,
je désire trier les résultats en fonction du champ "valeur" de ma table. Si je fais un simple ORDER BY valeur, il me retourne les nombres classés selon leur longueur (1, 10, 100, 2, 20,...), or j'aimerais avoir les nombres dans l'ordre 1, 2, 10, 20, 100,...
Par contre, si je convertis ces nombres en INT, ça marche :
Code :
1
2
 
SELECT * FROM objets ORDER BY CAST ( valeur AS INT )
Le petit problème est que ce champ ne va pas forcément contenir QUE des nombres, et dans ce cas ça ne fonctionne plus.
Y a-t-il un moyen simple de faire ce tri correctement ? Ou bien dois-je le programmer du côté de l'application ?
A condition d'avoir un moyen sûr de tester le type du champ, vous pouvez utiliser un CASE dans le SELECT dans lequel pour le cas "nombre" vous prendrez comme valeur à trier le right( concat ('0000000000000000', champ), 16) (en supposant que la taille max de vos entiers soient de 16 digits - à adapter à vos besoins…)
JeitEmgie est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 15/08/2007, 21h58   #3
Invité de passage
 
Inscription : août 2007
Messages : 2
Détails du profil
Informations forums :
Inscription : août 2007
Messages : 2
Points : 1
Points : 1
Merci beaucoup pour la réponse ! Ca n'a pas l'air de fonctionner avec PostgreSQL (est-ce du code pour MySQL ?), mais ça m'a bien mis sur la voie. J'ai trouvé une fonction PostgreSQL qui complète automatiquement la valeur en ajoutant autant de fois que nécessaire un caractère avant le texte.
Voici ce que j'ai utilisé pour ajouter des "0" avant le texte jusqu'à ce qu'il ait une longueur de 16 caractères :
Code :
1
2
 
ORDER BY LPAD (champ,16,'0')
Maintenant ça fonctionne, merci !
ben106 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 04h44.


 
 
 
 
Partenaires

Hébergement Web