J'ai des numéros enregistrés en tant que VARCHAR
dans une base de données MySQL. Je ne peux pas les rendre INT
en raison d'autres circonstances dépendantes.
Il les prend comme caractère et non comme nombre lors du tri.
Dans la base de données j'ai
1 2 3 4 5 6 7 8 9 10...
Sur ma page il montre la liste ordonnée comme ceci:
1 10 2 3 4 5 6 7 8 9
Comment puis-je le faire apparaître classé par ordre croissant de numéros?
Si possible, remplacez le type de données de la colonne par un numéro si vous ne stockez que des numéros.
Si vous ne pouvez pas faire cela, convertissez votre valeur de colonne en un integer
explicitement avec
select col from yourtable
order by cast(col as unsigned)
ou implicitement par exemple avec une opération mathématique qui force une conversion en nombre
select col from yourtable
order by col + 0
BTW MySQL convertit les chaînes de gauche à droite. Exemples:
string value | integer value after conversion
--------------+--------------------------------
'1' | 1
'ABC' | 0 /* the string does not contain a number, so the result is 0 */
'123miles' | 123
'$123' | 0 /* the left side of the string does not start with a number */
Une autre façon, sans utiliser une seule distribution.
(Pour les personnes utilisant JPA 2.0, où aucun casting n'est autorisé)
select col from yourtable
order by length(col),col
EDIT: ne fonctionne que pour les entiers positifs
La colonne dans laquelle je trie contient n'importe quelle combinaison d'alpha et de numérique. J'ai donc utilisé les suggestions présentées dans ce message comme point de départ.
DECLARE @tmp TABLE (ID VARCHAR(50));
INSERT INTO @tmp VALUES ('XYZ300');
INSERT INTO @tmp VALUES ('XYZ1002');
INSERT INTO @tmp VALUES ('106');
INSERT INTO @tmp VALUES ('206');
INSERT INTO @tmp VALUES ('1002');
INSERT INTO @tmp VALUES ('J206');
INSERT INTO @tmp VALUES ('J1002');
SELECT ID, (CASE WHEN ISNUMERIC(ID) = 1 THEN 0 ELSE 1 END) IsNum
FROM @tmp
ORDER BY IsNum, LEN(ID), ID;
Résultats
ID
------------------------
106
206
1002
J206
J1002
XYZ300
XYZ1002
J'espère que cela t'aides
n autre moyen simple
ORDER BY ABS(column_name)
Une autre façon de convertir.
Si vous avez un champ de chaîne, vous pouvez le transformer ou sa partie numérique de la manière suivante: ajoutez des zéros non significatifs pour que toutes les chaînes entières aient la même longueur.
ORDER BY CONCAT( REPEAT( "0", 18 - LENGTH( stringfield ) ) , stringfield )
ou commandez par partie de champ quelque chose comme 'tensymbols13', 'tensymbols1222' etc.
ORDER BY CONCAT( REPEAT( "0", 18 - LENGTH( LEFT( stringfield , 10 ) ) ) , LEFT( stringfield , 10 ) )
Cela fonctionne pour moi.
select * from tablename
order by cast(columnname as int) asc
Je cherchais également un champs de tri qui a un préfixe de lettre. Voici ce que j'ai trouvé la solution. Cela pourrait aider ceux qui recherchent la même solution.
Valeurs de champ:
FL01,FL02,FL03,FL04,FL05,...FL100,...FL123456789
select SUBSTRING(field,3,9) as field from table order by SUBSTRING(field,3,10)*1 desc
SUBSTRING(field,3,9)
j'ai mis 9 parce que 9 est assez pour moi pour contenir un maximum de 9 chiffres.
Le résultat sera donc 123456789 123456788 123456787 ... 100 99 ... 2 1
Cela gérera les nombres négatifs, les fractions, la chaîne, tout:
ORDER BY ISNUMERIC(col) DESC, Try_Parse(col AS decimal(10,2)), col;