J'essaie de commander par une colonne de numéro dans ma base de données qui a les valeurs 1-999
Quand j'utilise
ORDER_BY registration_no ASC
Je reçois….
1
101
102
103
104
105
106
107
108
109
11
110
Etc…
Il semble donc qu'il s'agisse de commander par le premier chiffre opposé au numéro.
Est-ce que quelqu'un sait ce que SQL à utiliser si je veux le commander par valeur? Alors 1,2,3,4,5,6
etc
Une façon de classer par nombres entiers positifs, lorsqu'ils sont stockés sous la forme varchar
, consiste à classer 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 peut s'appeler length()
au lieu de len()
.
ORDER_BY cast(registration_no as unsigned) ASC
convertit explicitement la valeur en nombre. Une autre possibilité pour atteindre le même objectif 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 changer. Vous pouvez changer le type de données en int
comme ceci
ALTER TABLE your_table MODIFY COLUMN registration_no int;
Si vous utilisez SQL Server:
ORDER_BY cast(registration_no as int) ASC
Je suppose que votre type de colonne est STRING (CHAR, VARCHAR, etc.) et que la procédure de tri le trie sous forme de chaîne. Ce que vous devez faire est de convertir la valeur en valeur numérique. Cela dépend du système SQL que vous utilisez.
ORDER_BY cast(registration_no as unsigned) ASC
donne le résultat souhaité avec des avertissements.
Par conséquent, il vaut mieux aller chercher
ORDER_BY registration_no + 0 ASC
pour un résultat propre sans aucun avertissement SQL.
Je préfère faire un "PAD" aux 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 (NomColonne, 3), ESPACE (1), '0')
Cette formule fournira des zéros à gauche basés sur la longueur de la colonne de 3. Cette fonctionnalité est très utile dans d'autres situations en dehors de ORDER BY. C'est pourquoi j'ai voulu proposer cette option.
Résultats: 1 devient 001 et 10 devient 010, tandis que 100 reste identique.
Parfois, vous n'avez simplement pas le choix de stocker des numéros mélangés à du texte. Dans l'une de nos applications, le site Web hébergé 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 n'importe quel champ sauf le texte affiché. Lorsque nous voulions créer des filtres sur une liste contenant des mots tels que 2 "à 8" 9 "à 12" 13 "à 15" etc., nous en avions besoin pour trier 2-9-13, et non 13-2-9 comme lire les valeurs numériques. J'ai donc utilisé la fonction SQL Server Replicate avec la longueur du nombre le plus long pour compléter les nombres les 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 minimales et maximales, les largeurs, etc. pour le type d'élément et la classe, et voici un exemple de la manière dont j'ai rédigé le texte. (LB n Bas et LB n Haut sont les extrémités basse et haute des 5 parenthèses 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