Chaîne de commande SQL en tant que numéro

J’ai des numéros enregistrés sous VARCHAR dans une firebase database MySQL. Je ne peux pas les faire en raison d’autres circonstances.

Il les prend comme caractère et non comme numéro lors du sorting.

Dans la firebase database j’ai

 1 2 3 4 5 6 7 8 9 10... 

Sur ma page, il montre une liste ordonnée comme ceci:

 1 10 2 3 4 5 6 7 8 9 

Comment puis-je le faire apparaître ordonné par numéros croissant?

Si possible, vous devez changer le type de données de la colonne en un nombre si vous ne stockez de toute façon que des nombres.

Si vous ne pouvez pas le faire, integer explicitement votre valeur de colonne en un integer 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:

 ssortingng value | integer value after conversion --------------+-------------------------------- '1' | 1 'ABC' | 0 /* the ssortingng does not contain a number, so the result is 0 */ '123miles' | 123 '$123' | 0 /* the left side of the ssortingng does not start with a number */ 

Une autre façon, sans utiliser une seule dissortingbution.

(Pour les personnes qui utilisent 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 avec laquelle je sortinge a une combinaison quelconque d’alpha et de numérique; j’ai donc utilisé les suggestions de cet article pour commencer.

 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

Un 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 façon suivante: ajoutez des zéros non significatifs pour que toutes les chaînes de nombres entiers aient la même longueur.

 ORDER BY CONCAT( REPEAT( "0", 18 - LENGTH( ssortingngfield ) ) , ssortingngfield ) 

ou ordonner par partie d’un champ quelque chose comme ‘tensymbols13’, ‘tensymbols1222’ etc.

 ORDER BY CONCAT( REPEAT( "0", 18 - LENGTH( LEFT( ssortingngfield , 10 ) ) ) , LEFT( ssortingngfield , 10 ) ) 

Cela va gérer les nombres négatifs, les fractions, les chaînes, tout –

ORDER BY ISNUMERIC(col) DESC, Try_Parse(col AS decimal(10,2)), col;

Cela fonctionne pour moi.

 select * from tablename order by cast(columnname as int) asc 

Je cherchais aussi un champs de sorting avec un préfixe de lettre. Voici ce que j’ai trouvé la solution. Cela peut 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) Je mets 9 parce que 9 est suffisant pour que je puisse tenir un nombre entier de 9 chiffres maximum.

Le résultat sera donc 123456789 123456788 123456787 … 100 99 … 2 1

Pour MySQL, vous pouvez utiliser ceci:

 SELECT your_column FROM your_table ORDER BY LENGTH(your_column) ASC, your_column ASC 

Modifiez votre champ pour qu’il soit INT au lieu de VARCHAR.

Je ne peux pas les faire en raison d’autres circonstances.

Ensuite, corrigez d’abord les circonstances. Sinon, vous travaillez sur le véritable problème sous-jacent. L’utilisation de MySQL CAST est une option, mais elle masque votre mauvais schéma qui devrait être corrigé.