|
Publicité ' | |||||||||||||||||||||||
|
|
#1 |
|
Membre à l'essai
![]() Développeur informatique Inscription : mai 2008 Messages : 100 ![]() |
Bonjour,
J'ai une table avec un champ de type varchar(10). Ce champ représente un n° de BD et il peut contenir une valeur entière (1,2,3,...,10,11,12,...) ou une chaîne (HS pour hors-série par exemple). Avec un ORDER BY classique, je les récupère dans cet ordre : 1,10,11,12,...,2,21,...,3,31,...,HS1,HS2,... (normal, c'est un varchar) Mais je les voudrais comme ça : 1,2,3,...,10,11,12,...,HS1,HS2,... Comment faire ? J'ai pensé à enregistrer mes valeurs en base ainsi : 01,02,03,... Mais si je passe la barre des 100, le problème se reposera. Et en plus j'ai pas trop envie de m'amuser à rajouter un 0 par-ci, ou retirer un 0 par-là selon les cas. Merci
__________________
GRULF
|
|
|
00
|
|
|
#2 |
![]() ![]() |
Quel est ton SGBD ?
Regarde du côté de CAST pour transformer les chaînes en nombres et du côté de CASE pour tester si c'est bien un nombre et ainsi les mettre en premier ordre de tri.
__________________
Philippe Leménager. Ingénieur d'étude à l'École Nationale de Formation Agronomique. Mon blog sur la conception des BDD, le langage SQL, le PHP avec Zend Framework... « Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément ». (Nicolas Boileau) À la maison comme au bureau, j'utilise Mandriva Linux ou Mageïa ! Soutenons l'industrie logicielle française ! Linuxiens, comptez-vous ! |
|
00
|
|
|
#3 | ||||
|
Membre Expert
![]() Sylvain DevidalChef de projets Générix Inscription : février 2010 Messages : 1 062 ![]() |
Avec Oracle, tu peux créer la fonction :
Code :
Code :
|
||||
|
|
00
|
|
|
#4 |
|
Membre à l'essai
![]() Développeur informatique Inscription : mai 2008 Messages : 100 ![]() |
Merci, mais c'est vrai que j'ai oublié de dire que je suis sous MySQL.
=> Crash Code :
ORDER BY CAST(bdt.NUMERO_TOME AS SIGNED) Code :
ORDER BY IFNULL(CAST(bdt.NUMERO_TOME AS INT),bdt.NUMERO_TOME) Code :
ORDER BY IFNULL(CAST(bdt.NUMERO_TOME AS SIGNED),bdt.NUMERO_TOME) Je regarde du côté de CASE.
__________________
GRULF
|
|
|
00
|
|
|
#5 | ||
![]() ![]() |
Je ne sais pas si ça fonctionnerait avec d'autres SGBD mais il se trouve que sous MySQL, si tu divises une colonne par elle-même et que celle-ci a une valeur pouvant être traduite par un nombre, l'opération s'effectue ou donne NULL dans le cas contraire.
'4' / '4' => 1 'HS 1' / 'HS 1' => NULL Donc avec cette requête qui donne une priorité aux divisions non nulles, tu obtiens le bon classement : Code :
__________________
Philippe Leménager. Ingénieur d'étude à l'École Nationale de Formation Agronomique. Mon blog sur la conception des BDD, le langage SQL, le PHP avec Zend Framework... « Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément ». (Nicolas Boileau) À la maison comme au bureau, j'utilise Mandriva Linux ou Mageïa ! Soutenons l'industrie logicielle française ! Linuxiens, comptez-vous ! |
||
|
00
|
|
|
#6 |
|
Membre Expert
![]() Sylvain DevidalChef de projets Générix Inscription : février 2010 Messages : 1 062 ![]() |
Je pense tout de même qu'il serait plus intéressait de trouver comment faire un natural sort avec MySQL (ça doit être possible).
En effet, autant "4" est avant "HS 1", autant il est après "1 HS". Idem pour trier "HS 1", "HS 10" et "HS "2". Si vraiment MySQL ne le supporte pas, il faudrait peut-être penser à faire ce tri non pas dans le SGBD mais dans l'outils qui interroge le SGBD, mais niveau performances, ça peut vite devenir moyen, et surtout ça ne résoud pas tout les cas, notamment si tu en as besoin lors de traitements plus complexes en PL/SQL notamment. |
|
|
00
|
|
|
#7 |
![]() ![]() |
Effectivement, il peut y avoir problème avec l'ordre HS 1, HS 10, HS 2.
Si tous les HS sont formés de la même manière (par exemple les lettres HS suivies d'un espace puis d'un numéro), alors on peut utiliser les fonctions de chaîne supprimer les caractères et trier les numéros. Pas le temps d'étudier ça maintenant mais c'est l'idée.
__________________
Philippe Leménager. Ingénieur d'étude à l'École Nationale de Formation Agronomique. Mon blog sur la conception des BDD, le langage SQL, le PHP avec Zend Framework... « Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément ». (Nicolas Boileau) À la maison comme au bureau, j'utilise Mandriva Linux ou Mageïa ! Soutenons l'industrie logicielle française ! Linuxiens, comptez-vous ! |
|
00
|
|
|
#8 |
|
Membre à l'essai
![]() Développeur informatique Inscription : mai 2008 Messages : 100 ![]() |
Merci pour vos réponses, je regarderai ça lundi.
Mais je pense que la solution de CinePhil devait me suffire. Les HS sont formés de la même manière, et il ne devrait pas y en avoir plus de 3 ou 4 pour chaque résultat de requête. Je teste ça demain et je vous redis si j'arrive à en faire ce que je veux. Merci
__________________
GRULF
|
|
|
00
|
|
|
#9 |
|
Membre émérite
![]() Olivier DehorterIngenieur de recherche - Ecologue Inscription : juin 2003 Messages : 697 ![]() |
Une petite remarque (en passant).
Ne serait il pas judicieux (si c'est possible dans ton contexte, bien sur), d'avoir * une colonne "Type" Integer * une colonne "HS" analogue boolean et une contrainte d'unicité sur ces 2 colonnes. Comme cela ton tri serait et te donnerait le résultat escompté. Mais seulement si tu peux modifier la structure
|
|
|
00
|
|
|
#10 |
|
Membre à l'essai
![]() Développeur informatique Inscription : mai 2008 Messages : 100 ![]() |
Effectivement, ça serait plus judicieux, vu que je peux modifier la structure.
Je vais partir là-dessus. Merci
__________________
GRULF
|
|
|
00
|
|
|
#11 | ||
|
Membre éclairé
![]() |
si tu n'as que des données de type 1,2,3...66..366.9999 et HS1,HS2..HS660 ou HS 1,HS 2...HS 654,...
voici la requête sous ORACLE Code :
1/ on fait le premier tri comme suit : on teste si le champ est un numérique, généralement dans les autres SGBD on trouve la fonction is_numeric...isnumeric ou ..., puis on le convertit en numérique. 2/ deuxième tri : on tronque le champ à partir du troisième caractère en prenant la partie numérique, puis on convertit cette dernière en numérique. |
||
|
|
00
|
Copyright © 2000-2012 - www.developpez.com