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.

2voto

Je préfère faire un "PAD" sur les données. MySql appelle cela LPAD, mais vous pouvez vous débrouiller pour faire la même chose dans SQL Server.

ORDER BY  REPLACE(STR(ColName, 3), SPACE(1), '0') 

Cette formule fournira des zéros non significatifs sur la base de la longueur de 3 de la colonne. Cette fonctionnalité est très utile dans d'autres situations que ORDER BY, c'est pourquoi j'ai voulu fournir cette option.

Résultats : 1 devient 001, et 10 devient 010, tandis que 100 reste le même.

1voto

Joey Morgan Points 530

Parfois, vous n'avez tout simplement pas le choix de stocker des chiffres mélangés à du texte. Dans l'une de nos applications, l'hôte du site web que nous utilisons pour notre site de commerce électronique crée des filtres de manière dynamique à partir de listes. Il n'y a pas d'option pour trier par un champ quelconque, sauf le texte affiché. Lorsque nous voulions des filtres construits à partir d'une liste qui disait des choses comme 2 pouces à 8 pouces 9" à 12" 13" à 15" etc., nous avions besoin de trier 2-9-13, et non 13-2-9 comme il le ferait en lisant les valeurs numériques. J'ai donc utilisé la fonction de réplication du serveur SQL ainsi que la longueur du plus long nombre pour compléter les nombres plus courts avec un espace. Maintenant, 20 est trié après 3, et ainsi de suite.

Je travaillais avec une vue qui me donnait les longueurs, largeurs, etc. minimales et maximales pour le type et la classe de l'article, et voici un exemple de la façon dont j'ai fait le texte. (LB n Bas et LB n High sont les extrémités basse et haute des 5 fourchettes de longueur).

REPLICATE(' ', LEN(LB5Low) - LEN(LB1High)) + CONVERT(NVARCHAR(4), LB1High) + '" and Under' AS L1Text,
REPLICATE(' ', LEN(LB5Low) - LEN(LB2Low)) + CONVERT(NVARCHAR(4), LB2Low) + '" to ' + CONVERT(NVARCHAR(4), LB2High) + '"' AS L2Text,
REPLICATE(' ', LEN(LB5Low) - LEN(LB3Low)) + CONVERT(NVARCHAR(4), LB3Low) + '" to ' + CONVERT(NVARCHAR(4), LB3High) + '"' AS L3Text,
REPLICATE(' ', LEN(LB5Low) - LEN(LB4Low)) + CONVERT(NVARCHAR(4), LB4Low) + '" to ' + CONVERT(NVARCHAR(4), LB4High) + '"' AS L4Text,
CONVERT(NVARCHAR(4), LB5Low) + '" and Over' AS L5Text

1voto

Dev Rathi Points 407

Ce problème est dû au fait que vous avez déclaré la colonne dans le type de données CHAR, VARCHAR ou TEXT. Changez simplement le type de données en INT, BIGINT etc. Ceci résoudra le problème de votre commande personnalisée.

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