2009-04-02 7 views
4

SQLServer/MSSQL, voici le problème:Retourne les enregistrements ordonnés par ordre alphabétique par une certaine lettre dans Sql Server

SELECT * from [Translation Color] order by [Language Code] 

Je veux des documents classés par ordre alphabétique, en commençant par la lettre « I ».

Exemple de résultat:

'Ioren' 'Iumen' 'Tart' 'Arfen' 'Coldry'

Je ne veux pas utiliser des instructions union ou plus .. juste sql essayer de l'attraper avec une commande par clause spéciale.

J'ai essayé avec:

ORDER BY <field> REGEXP '^I' DESC 

mais cela n'a pas fonctionné.

Des idées?

Répondre

3

Cela devrait le faire:

ORDER BY CASE WHEN SUBSTRING([Translation Color],1,1) = 'l' 
    THEN 1 ELSE 0 END DESC 

EDIT:

réponse complète pour commander à partir complètement à i, en boucle puis dos rond à h est:

ORDER BY CASE WHEN ASCII(UPPER(SUBSTRING([Translation Color],1,1))) < 73 
     THEN ASCII(UPPER(SUBSTRING([Translation Color],1,1))) + 26 
     ELSE ASCII(UPPER(SUBSTRING([Translation Color],1,1))) END ASC,  
     [Translation Color] ASC 

S'il vous plaît noter que cette affectera les performances sur les grandes tables.

+0

== donne une erreur, mais avec one = cela fonctionne! merci – apelliciari

+0

N'oubliez pas de vérifier que la performance est acceptable, surtout si vous avez ou êtes susceptible d'avoir un grand ensemble de données. –

+0

Ouais désolé à ce sujet, je suis en train de coder en C# au mo, mais je l'ai édité pour avoir raison. – cjk

2

est Sinon ce tout bon:

select [Translation Color], 
    case when [Translation Color] < 'l' then 1 
        else 0 
        end as Priority 
from t1 
order by Priority, [Translation Color] 

Cela commander à partir alphabeticly à 'l'

Modifier Cette solution semble fonctionner pour moi:

create table t1 (c1 varchar(20) collate SQL_Latin1_General_Cp437_CI_AS) 

alors j'ai peuplé avec quelques données de test puis exécutez ceci:

select c1 
from t1 
order by case when c1 >= 'l' then 0 else 1 end, c1 
+0

+1: bonne réponse, très propre, mais utilise un élément séparé dans l'instruction select – cjk

+0

Ma modification fonctionne parfaitement mais n'utilise pas la clause order by. –

+0

... * maintenant * utilise (non pas) la clause order by! –

1
SELECT * 
FROM [Translation Color] 
ORDER BY 
    CASE WHEN [Language Code] LIKE '[I-Zi-z]%' THEN 0 ELSE 1 END, 
    [Language Code] 
+0

+1: Bonne réponse, mais la clause LIKE pourrait être assez lente sur de gros ensembles de données, mais pas aussi lente que la mienne :) (cependant je suppose que c'est une petite table de recherche) – cjk

+0

@ck, Le LIKE n'est pas idéal, mais il devrait toujours être capable d'utiliser n'importe quel index dans la colonne [Code de langue]. Je soupçonne que l'utilisation de SUBSTRING, ASCII, UPPER etc. nécessiterait un balayage de table. – LukeH

+0

@ck, je suis d'accord que c'est probablement une petite table de recherche. Cependant, même si chaque goutte de performance n'est pas vitale, je pense que ma réponse est plus lisible que toutes ces fonctions de cordes. – LukeH

Questions connexes