2010-09-27 6 views
1

j'ai un domaine comme:Aide T-sql règles de tri spéciales

SELECT * FROM 
(
    SELECT 'A9t' AS sortField UNION ALL 
    SELECT 'A10t' UNION ALL 
    SELECT 'A11t' UNION ALL 
    SELECT 'AB9F' UNION ALL 
    SELECT 'AB10t' UNION ALL   
    SELECT 'AB11t' 
) t ORDER BY sortField 

et le résultat est:

sortField 
--------- 
A10t 
A11t 
A9t 
AB10t 
AB11t 
AB9F 

En fait, j'ai besoin est de combiner les règles de tri de chaînes et numéro:

sortField 
--------- 
A9t 
A10t 
A11t 
AB9F 
AB10t 
AB11t 
+1

Il y a toujours une lettre à l'avant? – CristiC

+0

Non, peut être 'Abc9t' – guaike

+1

Je pense que ça s'appelle "ordre naturel". Il y a déjà la même question (?) [Ici] (http://stackoverflow.com/questions/34509/natural-human-alpha-numeric-sort-in-microsoft-sql-2005). – pascal

Répondre

1

Si le premier caractère est toujours une lettre, essayez:

SELECT * FROM 
(
    SELECT 'A9t' AS sortField UNION ALL 
    SELECT 'A10t' UNION ALL 
    SELECT 'A11t' 
) t ORDER BY substring(sortField,2,len(sortField)-1) desc 
4
SELECT * 
FROM  ( 
      SELECT 'A9t' AS sortField UNION ALL 
      SELECT 'A10t' UNION ALL 
      SELECT 'A11t' UNION ALL 
      SELECT 'AB9F' UNION ALL 
      SELECT 'AB10t' UNION ALL   
      SELECT 'AB11t' 
     ) 
     t 
ORDER BY LEFT(sortField,PATINDEX('%[0-9]%',sortField)-1)                      , 
     CAST(substring(sortField,PATINDEX('%[0-9]%',sortField),1 + PATINDEX('%[0-9][A-Z]%',sortField) -PATINDEX('%[0-9]%',sortField)) AS INT), 
     substring(sortField,PATINDEX('%[0-9][A-Z]%',sortField) + 1,LEN(sortField)) 
+0

Merci, dans votre solution la chaîne de champ est la même règle, j'ai changé le sujet, s'il vous plaît jeter un oeil – guaike

+0

Édité pour traiter les préfixes et les suffixes> 1 caractère. –

0

Je dirais que vous avez combiné le tri alpha et numérique. Mais ce que je pense que vous demandez, c'est que vous voulez trier les lettres dans l'ordre croissant et les numéros dans l'ordre décroissant, et cela pourrait être difficile à faire d'une manière agréable. Les réponses précédentes ne fonctionneront pas pour votre problème, le problème est que la solution de Martin Smith ne prend pas les chaînes avec deux lettres comme préfixe et Parkyprg ne triera pas les chiffres avant les lettres comme vous le demandez.

Ce que vous devez faire est d'utiliser une commande personnalisée, voir l'exemple ici: http://www.emadibrahim.com/2007/05/25/custom-sort-order-in-a-sql-statement/, mais c'est une manière fastidieuse de le faire.

EDIT: La solution de Martins Smith est mise à jour et fonctionne très bien!

+0

euh, oui il le fait (maintenant!) –

+0

oui c'est le cas, belle solution lors de mon poste. vous auriez mon vote si je pouvais voter. –