sql: ORDER BY alphabetique pour des données du genre 12CAY

sql: ORDER BY alphabetique pour des données du genre 12CAY - SQL/NoSQL - Programmation

Marsh Posté le 03-10-2006 à 11:55:05    

Bonjour,
alors j'ai un petit soucis pour trier mes données,
je voudrais les trier par ordre alphabetique sachant que mon champ (ref) contient des données du type 2FG ou 13GHJ etc.
 
Donc comment faire une requete qui trie sans tenir compte des chiffres qui précedent les lettres.
 
J'ai vu qu'on pouvait utiliser LTRIM par exemple, mais je ne vois pas trop comment  :??:  
 
Merci pour le coup de pouce !
Bonne journée  :p

Reply

Marsh Posté le 03-10-2006 à 11:55:05   

Reply

Marsh Posté le 03-10-2006 à 12:22:04    

1/ quel SGBD ?
2/ que veux-tu exactement ?
3/ qu'est-ce que tu obtiens ?
4/ mysql supporte un tri "naturel", c'est à dire qu'il comprends que "13GHJ" est après "2FG" quand on "comprend" les nombres (aucun autre SGBD ne le permet, le 13 se retrouvant avec le 2 puisque ce sont des chaines de caractères)

Reply

Marsh Posté le 03-10-2006 à 12:44:33    

C'est sur une base MySql
Lorsque je fais un ORDER BY ref, j'obtiens
12vfr
13gt
2rt
21df
...
 
je voudrais que mysql me trie ces valeur non pas par les nombre qui précedent les lettres, mais par les lettres elles-meme:
21df
13gt
2rt
12vfr
...
 
pour ce qui est de ton 4/ mysql ne me les trie pas comme tu le mets, que faut-il faire justement pour qu'il me fasse un trie "naturel" ? ORDER BY NATURAL (ref) ?

Reply

Marsh Posté le 03-10-2006 à 14:22:15    

ok, hmmm, ça me semble quelque peut complexe ton truc...
 
regarde si MySQL supporte dans ses fonctions de chaîne quelque chose à partir d'expressions régulières.
 
Ainsi, tu pourras faire le ORDER BY sur ce qui correspond à ce qui suit le nombre. Genre un truc du genre : order by regmatch('[0-9].(*.)') (la fonction et l'expression régulières sont au pifomètre et à titre d'exemple hein)

Reply

Marsh Posté le 03-10-2006 à 14:33:49    

Le problème de TRIM() c'est qu'ellefonctionne sur un nombre fixe de caractères et qu'ici, le nombre de chiffres semble varier alétoirement.
 
Mais en revanche dis-nous : est-ce que la chaîne de caractères qui suit les chiffres en question a-t-elle une longueur fixe ?  
Si c'est le cas, tu pourrais "padder" la string avec des 0 non significatifs et faire un trim() :)

Reply

Marsh Posté le 03-10-2006 à 15:24:05    

non, malheureusement, les réferences ont des longueurs variables autant du coté des chiffres (2 maxi quand meme) et des lettres.
Il faudrait en effet une sorte de fonction regex

Reply

Marsh Posté le 03-10-2006 à 15:35:14    

La solution devrait être alors du côté de REGEXP
 
*edit*  
 
Le truc c'est que je pense pas qu'il soit possible de trier sur un champ qui ne se trouve pas dans le Select donc tu devras d'une manière ou d'une autre le faire figurer ...
 
Du genre :  
 
SELECT ref, ref REGEXP '[:alpha:]' as tri
from matable
order by tri
 
(au pif aussi, j'ai pas essayé, et puis en plus je pense que le REGEXP retourne pas sa sélection, bref à investiguer)
 
Faudrait pas que dans la chaîne alphabétique qui suit tes chiffres tu aies d'autres chiffres hein :)


Message édité par ZeBix le 03-10-2006 à 15:42:46
Reply

Marsh Posté le 03-10-2006 à 16:16:25    

ben si, il peut aussi y avoir des chiffres...
 
Je vais voir du coté de REGEXP

Reply

Marsh Posté le 03-10-2006 à 16:28:43    

ton SELECT ne fonctionne pas...
 
sinon je peux toujours retrier mon tableau avec php. Mais bon c'est pas l'ideal

Reply

Marsh Posté le 05-10-2006 à 14:52:40    

pas d'idées ?

Reply

Marsh Posté le 05-10-2006 à 14:52:40   

Reply

Marsh Posté le 05-10-2006 à 16:54:25    

Quand on te dis de regarder du côté de la doc des expressions régulières :o
 
Voilà ce que donne ta requête SOUS ORACLE.
Donc démerde-toi avec la doc de MySQL pour trouver l'équivalent, et ne me dit pas que mon truc ne marche pas : oui, il ne marche pas sous MySQL, ou alors c'est une coincidence fortuite.
 


SELECT codpro
FROM pro
WHERE codsoc = 2
order by REGEXP_replace(codpro, '^([[:digit:]]*)(.*)$', '\2')


Message édité par MagicBuzz le 05-10-2006 à 19:29:50
Reply

Marsh Posté le 05-10-2006 à 18:26:43    

ben je suis allé voir...
 
... j'y retourne !
 
merci

Reply

Marsh Posté le 07-05-2008 à 16:04:26    

Sujet intéressant la fonction n'est pas dispo sous mysql version 5 .. je peux effectuer le Replace, mais sans expression régulière
 ( la fonctionnalité permettrait d'économiser un temps considérable dans mon taff )
Au lien de ça .. rechercher les enregistrements similaires .. faire le ereg_replace en php puis l'update .. à chaque fois .. frak ..


Message édité par grosbin le 07-05-2008 à 16:08:17

---------------
Photos Panoramiques Montagnes Haute Savoie
Reply

Marsh Posté le 26-11-2008 à 19:01:21    

Je déterre ce sujet, mais j'ai été confronté à ce genre de problématique :
 
cas typique, j'ai des champs suivants :
 
weblogic1
weblogic10
weblogic2
weblogic3
 
Le weblo 10 n'a rien à faire là avec mon 'order by'.
 
Mais en faisant un 'order by length(mon_champ),monchamp' , c'est ok.
 
Valà valà...
 
 

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed