2010-07-20 5 views
0

Je veux faire un truc order by en utilisant une partie d'un exemple column.For, certains enregistrements de la colonne user regard comme ci-dessousComment commander par une partie d'une colonne?

vip1,vip2,vip21,vip10,vip100 

Si je fais un order by user, l'ordre serait

vip1,vip10,vip100,vip2,vip21 

Alors, comment puis-je faire le résultat comme suit

vip1,vip2,vip10,vip21,vip100 

Merci.

Répondre

1

Quel RDBMS?

Pour SQL Server pour obtenir le tri numérique plutôt que lexicographique le tri serait quelque chose comme

ORDER BY CAST(RIGHT(col, LEN(col)-3) AS INT) 

Pour MySQL

ORDER BY CAST(RIGHT(col, LENGTH(col)-3) AS UNSIGNED) 

mais pourquoi Entreposez-vous la partie vip du tout si elle est même pour toutes les lignes?

+0

ouais c'est un point. Mais les tables sont conçues par d'autres si peu peut faire à ce sujet. :( – Young

1

Vous pouvez également remplacer le nom d'utilisateur ('vip') par rien ('') et ajouter zéro, puis trier. Pas plus efficace, juste plus générique.

1

La partie "préfixe" contient-elle toujours exactement 3 caractères? Sinon, cela devient compliqué. Umm, avec Postgres vous pourriez

order by regexp_matches(userid,"^[a-z]*")[1], substring(userid, regexp_matches(userid,"^[a-z]*")[1])::int 

Je pense que cela fonctionnerait, je ne l'ai pas essayé. Quoi qu'il en soit, le fait est que, si vous avez une fonction qui fera des expressions régulières, vous pouvez retirer une chaîne d'alphas, puis enlever ce qui reste et le convertir en int.

Si vous incorporez réellement un nombre dans un champ alpha, une meilleure alternative est: Ne faites pas cela. S'il s'agit de deux éléments de données logiques différents, créez deux champs. Il est beaucoup plus facile de rassembler des champs que de les démonter.

+0

Nice suggestions.Merci. – Young

Questions connexes