118 votes

SQL pour le classement par numéro - 1,2,3,4 etc. au lieu de 1,10,11,12

J'essaie d'ordonner par une colonne de nombres dans ma base de données qui a des valeurs 1-999.

Quand j'utilise

ORDER_BY registration_no ASC

J'obtiens .

1
101
102
103
104
105
106
107
108
109
11
110
Etc…

Il semble donc que le classement se fasse par le premier chiffre plutôt que par le numéro.

Quelqu'un sait-il quel SQL utiliser si je veux ordonner cela par valeur ? Donc 1,2,3,4,5,6 etc.

183voto

Gordon Linoff Points 213350

Une façon d'ordonner par des nombres entiers positifs, lorsqu'ils sont stockés sous la forme de varchar Le principe de base est de commander d'abord par la longueur, puis par la valeur :

order by len(registration_no), registration_no

Ceci est particulièrement utile lorsque la colonne peut contenir des valeurs non numériques.

Remarque : dans certaines bases de données, la fonction permettant d'obtenir la longueur d'une chaîne de caractères peut être appelée length() au lieu de len() .

83voto

juergen d Points 85039
ORDER_BY cast(registration_no as unsigned) ASC

convertit explicitement la valeur en un nombre. Une autre possibilité pour obtenir le même résultat serait

ORDER_BY registration_no + 0 ASC

ce qui forcera une conversation implicite.

En fait, vous devriez vérifier la définition de la table et la modifier. Vous pouvez changer le type de données en int comme ceci

ALTER TABLE your_table MODIFY COLUMN registration_no int;

De cette façon, les index peuvent être utilisés correctement et la order by ne ralentira pas la requête.

16voto

IPOSTEDONCE Points 141

Si vous utilisez SQL Server :

ORDER_BY cast(registration_no as int) ASC

8voto

priyanka Points 43
ORDER_BY cast(registration_no as unsigned) ASC

donne le résultat souhaité avec des avertissements.

Il est donc préférable d'opter pour

ORDER_BY registration_no + 0 ASC

pour obtenir un résultat propre sans aucun avertissement SQL.

2voto

Je suppose que le type de votre colonne est STRING (CHAR, VARCHAR, etc.) et que la procédure de tri la classe comme une chaîne. Ce que vous devez faire est de convertir la valeur en valeur numérique. La façon de le faire dépend du système SQL que vous utilisez.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X