Comment appliquer un ordre de sorting de colonne SQL non standard?

Considérez le tableau suivant nommé Persons :

 Key Name Type Date Pack 1 Pocoyo KIND 30-11-2011 1 2 Erik MAN 10-10-1980 1 3 Alinda VROUW 12-12-1991 1 4 Pingu KIND 11-12-2012 1 5 Elisia KIND 11-11-2010 1 6 Kees MAN 10-11-1984 2 

Maintenant, je voudrais sortinger cette table sur Pack , Type et Date , mais je voudrais que le Type soit sortingé comme MAN , VROUW , KIND , donc, fondamentalement, le résultat souhaité devrait être comme:

 Key Name Type Date Pack 2 Erik MAN 10-10-1980 1 3 Alinda VROUW 12-12-1991 1 5 Elisia KIND 11-11-2010 1 1 Pocoyo KIND 30-11-2011 1 4 Pingu KIND 11-12-2012 1 6 Kees MAN 10-11-1984 2 

Comment puis-je créer cette requête?

Essaie

 SELECT * FROM Persons ORDER BY Pack, CASE Type WHEN 'MAN' THEN 1 WHEN 'VROUW' THEN 2 WHEN 'KIND' THEN 3 END, Date ASC 

MSDN: CASE (Transact-SQL)

CASE peut être utilisé dans toute instruction ou clause permettant une expression valide. Par exemple, vous pouvez utiliser CASE dans des instructions telles que SELECT, UPDATE, DELETE et SET, et dans des clauses telles que select_list, IN, WHERE, ORDER BY et HAVING.

Je serais enclin à créer une nouvelle table de données de reference, disons PersonType pour contenir les valeurs attendues de la colonne "Type" et leur priorité de sorting relative:

 Type SortPriority MAN 1 VROUW 2 KIND 3 

Et faites une jointure externe gauche sur cette table pour déterminer l'ordre de sorting des résultats de la requête par rapport à Persons:

 SELECT * FROM Persons p LEFT OUTER JOIN PersonType pt on p.Type = pt.Type ORDER BY Pack, SortPriority, Date 

Je suppose, à cause de vos commentaires, que votre command non standard est due à l'ordre des articles dans l'énumération. Si c'est le cas, pensez à stocker la valeur, pas le nom de l'énumération dans la database. Laissez votre DAL convertir l'énumération lors de la lecture / écriture dans la database. Par exemple, aujourd'hui, dans EntityFramework, nous pouvons écrire une petite class wrapper qui devient le type de la colonne enum et définir l'équivalence et les conversions implicites entre l'encapsuleur et l'enum. Voir cette réponse pour plus d'informations sur enums et EF. Dans le CTP de juin 2011, EF prend directement en charge cette traduction.