Bonjour,

J'ai des varchar dans lesquels je stocke des chiffres et des lettres.
Hors quand je veux les trier bah j'ai des truc comme ça :

001
002
006
075
1402
256

Mais ce n'est pas ce que je veux... Je veux que les chiffres soient classés dans l'ordre mathématique (001, 002, 006,075, 256, 1402).

Merci d'avance :)

8 réponses


Huggy
Réponse acceptée

Voici une solution qui fonctionne uniquement si les lettres sont devant

SELECT champ,
       max(case when substr(champ, 1, 1) between '0' and '9' then champ + 0
                when substr(champ, 2, 1) between '0' and '9' then substr(champ, 2) + 0
                when substr(champ, 3, 1) between '0' and '9' then substr(champ, 3) + 0
                when substr(champ, 4, 1) between '0' and '9' then substr(champ, 4) + 0
                when substr(champ, 5, 1) between '0' and '9' then substr(champ, 5) + 0
                when substr(champ, 6, 1) between '0' and '9' then substr(champ, 6) + 0
                when substr(champ, 7, 1) between '0' and '9' then substr(champ, 7) + 0
                when substr(champ, 8, 1) between '0' and '9' then substr(champ, 8) + 0
           end)  AS T              
FROM matable
GROUP BY champ
ORDER BY T;

le case va rechercher chaque caractère en partant de la gauche et s'arrète s'il a trouvé un caractère numérique
le +0 à la fin permet de transformer le résultat en numérique

GER -> NULL
09YTR -> 9
AB23 -> 23
45 -> 45
D0567 -> 567

Tu dois faire un cast

SELECT * FROM  matable ORDER BY CAST(monchamp AS SIGNED) 
Gofast77
Auteur

ça ne foctionne pas (j'avais déjà essayer).

Tu dis qu'il y a des lettres
sont-elles devant, derrière ?
peut-on les ignorer ?
donne nous un exemple

Gofast77
Auteur

Elle sont devant

Les ignorer ? C'est à dire ?

Ex : ABC001

Est-ce que tu veux que ABC001 soit placé comme 001 ?

Gofast77
Auteur

Oui et ABC1402 comme 1402 ;)

Gofast77
Auteur

Parfait merci beaucoup :)