web-dev-qa-db-fra.com

Chaîne de commande SQL sous forme de numéro

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?

115
Jamol

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 integerexplicitement 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 */
218
juergen d

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

61
Velter

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

16
Losbear

n autre moyen simple

ORDER BY ABS(column_name)

10
Parth Solanki

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 ) ) 
4
shukshin.ivan

Cela fonctionne pour moi.

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

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

2
user2400083

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;
2
Amir