web-dev-qa-db-fra.com

ORDRE SQL chars numériquement

J'ai une colonne de nombres stockée sous forme de caractères. Lorsque je fais une commande par pour cette colonne, j'obtiens ce qui suit:

100
131
200
21
30
31000
etc.

Comment puis-je commander ces caractères numériquement? Dois-je convertir quelque chose ou existe-t-il déjà une commande ou une fonction SQL pour cela?

Merci.

37
T.T.T.

Essaye ça:

ORDER BY CAST(thecolumn AS int)
74
Ray Hidayat

Cela a fonctionné pour moi:

ORDER BY ABS(column_name)
23
Nev

Il s'agit d'un problème avec la commande de chaînes numériques dans un "tri naturel" (si vous recherchez "tri naturel" sur Google, vous trouverez des tonnes de choses). Fondamentalement, la conversion de la chaîne en int et le tri sur la valeur résultante devraient la corriger.

2
BenAlabaster

Dans certaines situations, cela peut être un bon match:

ORDER BY LENGTH(column_name), column_name

Surtout si vous avez une colonne avec tous les chiffres ou un mélange de lettres et de chiffres mais tous avec la même longueur.

1
Irgendwoanders

La raison en est qu'avec un type de données char, vous triez les lignes sous forme de chaîne.

L'idée de ORDER BY CAST() est correcte, mais ses performances diminueront à mesure que le nombre de résultats renvoyés augmentera.

S'il ne s'agit que de données numériques dans cette colonne, la meilleure pratique serait de trouver un type de données numériques approprié et de le modifier.

Si vous ne pouvez vraiment pas modifier la colonne et que vous rencontrez des problèmes de performances, je suggère d'avoir une colonne d'ordre de tri qui contient la valeur convertie en un entier (les valeurs nulles seront converties en une valeur appropriée).

Indexez la colonne d'ordre de tri et, idéalement, ajoutez un déclencheur à la colonne CHAR afin que les insertions ou les mises à jour de la valeur char déclenchent une mise à jour de la valeur entière.

1
John