Bonjour,
On m'a confier un projet avec un base de donnée existante.
Je dois trier une colonne (de type VARCHAR) et qui contient des entiers + 1 caractère en fin.
Comment trier par exemple :
Merci1A
2
3
30E
103
123
123A
Bonjour,
On m'a confier un projet avec un base de donnée existante.
Je dois trier une colonne (de type VARCHAR) et qui contient des entiers + 1 caractère en fin.
Comment trier par exemple :
Merci1A
2
3
30E
103
123
123A
Quel SGBD ?
L'idée c'est de faire un substring du premier caractère à l'avant-dernier caractère, de convertir ceci en nombre et de trier dessus.
Il faut aussi gérer le cas où ton caractère alpha est nul.
MySQL.
Voila ce que j'ai pu sortir :
Mais je voudrais avoir ceux qui sont renseigné en premier et non pas les 0 en premier.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3 SELECT user_nom, CONVERT(user_parking,UNSIGNED INTEGER) AS nb, user_parking FROM `utilisateurs` ORDER BY (nb)
Par exemple :
Merci.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13 1 2 4 6 10 50 100 0 0 0 0 0 0
Ta séquence ne tient pas debout.
Soit tu as 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 50, 100
Soit tu as 100, 50, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0
Voire même 1, 10, 11, 2, 20, 3, 4, 50
Mais jamais 1, 2, 3, 5, 10, 50, 0
Si tu fais ORDER BY tu peux faire :
croissant : par défaut ou ASC
décroissant : DESC
(cf l'aide sur ORDER BY)
Le zéro sera à la fin si tu utilises DESC mais l'ordre sera 100, 50, 10, 5, 3, 2, 1, 0
Si je pense qu'il y a un moyen :
Code : Sélectionner tout - Visualiser dans une fenêtre à part order by case when nb = 0 then null else nb end asc nulls last
Je connais la syntaxe d'ORDER BY mais je voulais savoir si y avait une fonction SQL qui pouvait m'aider.
Ensuite j'ai essayé de ne pas afficher le 0 mais je comprend pas pourquoi, cette requete ne fonctionne pas.
Apparemment non supporté par MySQL...
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5 SELECT user_nom,user_email,user_tel_interne,user_tel_externe,user_fax ,user_tel_mobile, user_commentaire, CONVERT(user_parking,UNSIGNED INTEGER) AS user_parking_entier, user_parking FROM `utilisateurs` WHERE user_parking_entier <> 0 ORDER BY (user_parking_entier)
On ne peut pas utiliser d'alias dans le where, il faut remettre la fonction :
Désolé pour le nulls last, ça a l'air proriétaire à Oracle en effet.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5 SELECT user_nom,user_email,user_tel_interne,user_tel_externe,user_fax ,user_tel_mobile, user_commentaire, CONVERT(user_parking,UNSIGNED INTEGER) AS user_parking_entier, user_parking FROM `utilisateurs` WHERE CONVERT(user_parking,UNSIGNED INTEGER) <> 0 ORDER BY (user_parking_entier)
tu peux essayer ceci :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9 SELECT * FROM (SELECT user_nom, CONVERT(user_parking,UNSIGNED INTEGER) AS nb, user_parking, 2 as class FROM `utilisateurs` WHERE CONVERT(user_parking,UNSIGNED INTEGER) = 0 UNION SELECT user_nom, CONVERT(user_parking,UNSIGNED INTEGER) AS nb, user_parking, 1 as class FROM `utilisateurs` WHERE CONVERT(user_parking,UNSIGNED INTEGER) <>0 ) as temp order by temp.class,temp.nb
En gardant la même logique :
Assurez-vous que 9999999 soit suffisant par rapport à vos données.
Code : Sélectionner tout - Visualiser dans une fenêtre à part order by case when user_parking_entier = 0 then 9999999 else user_parking_entier end asc
La solution de Cybher me convient tout à fait.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9 SELECT * FROM (SELECT user_nom, CONVERT(user_parking,UNSIGNED INTEGER) AS nb, user_parking, 2 AS class FROM `utilisateurs` WHERE CONVERT(user_parking,UNSIGNED INTEGER) = 0 UNION SELECT user_nom, CONVERT(user_parking,UNSIGNED INTEGER) AS nb, user_parking, 1 AS class FROM `utilisateurs` WHERE CONVERT(user_parking,UNSIGNED INTEGER) <>0 ) AS temp ORDER BY temp.class,temp.nb
Merci à vous tous.
Vous avez un bloqueur de publicités installé.
Le Club Developpez.com n'affiche que des publicités IT, discrètes et non intrusives.
Afin que nous puissions continuer à vous fournir gratuitement du contenu de qualité, merci de nous soutenir en désactivant votre bloqueur de publicités sur Developpez.com.
Partager