sql: ORDER BY alphabetique pour des données du genre 12CAY - SQL/NoSQL - Programmation
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)
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) ?
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)
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()
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
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
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
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
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
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.
|
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 ..
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à...
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