J'ai des numéros enregistrés dans VARCHAR
une base de données MySQL. Je ne peux pas les faire en INT
raison d'autres circonstances dépendantes.
Il les prend comme des caractères et non comme des nombres 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 affiche une liste ordonnée comme celle-ci:
1 10 2 3 4 5 6 7 8 9
Comment puis-je le faire apparaître par ordre croissant de nombres?
Réponses:
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 faire cela, convertissez la valeur de votre colonne en
integer
explicitement avecou implicitement par exemple avec une opération mathématique qui force une conversion en nombre
BTW MySQL convertit les chaînes de gauche à droite. Exemples:
la source
1
decimal
.Une autre façon, sans utiliser une seule distribution.
(Pour les personnes qui utilisent JPA 2.0, où aucune diffusion n'est autorisée)
EDIT: ne fonctionne que pour les entiers positifs
la source
Un autre moyen simple
ORDER BY ABS(column_name)
la source
La colonne avec laquelle je trie contient n'importe quelle combinaison d'alpha et de numérique, j'ai donc utilisé les suggestions de cet article comme point de départ et j'ai proposé ceci.
Résultats
J'espère que cela t'aides
la source
1 - ISNUMERIC(ID)
au lieu de(CASE WHEN ISNUMERIC(ID) = 1 THEN 0 ELSE 1 END)
pour changer 0 en 1 et vice versa.Cela fonctionne pour moi.
la source
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 d'entiers aient la même longueur.
ou commandez par partie d'un champ quelque chose comme 'tensymbols13', 'tensymbols1222' etc.
la source
Je cherchais aussi un tri des champs 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:
SUBSTRING(field,3,9)
Je mets 9 parce que 9 me suffit amplement pour contenir des valeurs entières de 9 chiffres maximum.Le résultat sera donc 123456789 123456788 123456787 ... 100 99 ... 2 1
la source
Cela gérera les nombres négatifs, les fractions, la chaîne, tout:
la source
Cela pourrait aider qui cherche la même solution.
la source
Si vous utilisez AdonisJS et que vous avez des ID mixtes tels que ABC-202, ABC-201 ..., vous pouvez combiner des requêtes brutes avec Query Builder et implémenter la solution ci-dessus ( https://stackoverflow.com/a/25061144/4040835 ) comme suit:
NOTES: Dans cette ligne:
SUBSTRING(:sortField:,3,15)*1 ${sortDirection}
,Réf 1: Vous pouvez en savoir plus sur les liaisons de paramètres dans les requêtes brutes ici: https://knexjs.org/#Raw-Bindings Réf 2: Adonis Raw Queries: https://adonisjs.com/docs/4.1/query-builder# _raw_queries
la source
Modifiez votre champ pour qu'il soit INT au lieu de VARCHAR.
Ensuite, corrigez d'abord les circonstances dépendantes. Sinon, vous travaillez autour du vrai problème sous-jacent. Utiliser un CAST MySQL est une option, mais cela masque votre mauvais schéma qui devrait être corrigé.
la source