2010-07-21 9 views
32

J'ai une table avec les catégories:ordre SQLite et sur mesure par

ID Category 
"1","Baking" 
"3","Family" 
"4","Entertaining" 
"5","Children" 
"6","Desserts" 

Maintenant, je voudrais commander le résultat de l'instruction select à

ID Category 
"4","Entertaining" 
"3","Family" 
"1","Baking" 
"5","Children" 
"6","Desserts" 

par exemple. Dans MySQL, vous feriez comme ceci:

SELECT * FROM CATEGORIES ORDER BY FIELD (ID, 4,3,1,5,6); 

Comment feriez-vous dans SQLite si? Je n'ai pas de champ "order by".

Répondre

59
ORDER BY 
    CASE ID 
    WHEN 4 THEN 0 
    WHEN 3 THEN 1 
    WHEN 1 THEN 2 
    WHEN 5 THEN 3 
    WHEN 6 THEN 4 
    END 
+3

+1 ya moi aussi, je viens de le taper sur. L'autre option est bien sûr de créer un attribut qui agit en priorité, alors vous pouvez simplement classer par ordre de priorité. Ce n'est pas le moyen idéal, mais une solution que j'ai dû utiliser par le passé. – northpole

+0

Pour la vitesse avec des ensembles de données volumineux, je créerais probablement une table auxiliaire indexée qui contiendrait les identifiants et leur ordre désiré, puis se joindrait à elle et serait ordonnée par sa colonne indexée. Je ne suis pas sûr de la façon dont SQLite gérera cela, mais les moteurs de base de données «plus grands» en bénéficieront probablement, car l'expression CASE n'est pas optimale pour la commande. – Tomalak

1

Je n'ai pas "commande par" champ

Pourquoi pas?

Si c'est parce que l'ordre de tri est spécifique à l'application, effectuez le tri dans l'application plutôt que dans la base de données.

Si c'est parce que l'ordre de tri est spécifique à cette seule requête, puis l'encoder dans la requête CEPENDANT, je vous suggère fortement de le rendre transparent pour l'application appelante, par exemple. (Syntaxe standard SQL):

SELECT T2.ID, T2.Category, 
     T2.query_name_here_sort_order 
    FROM (
     SELECT T1.ID, T1.Category, 
       CASE ID 
        WHEN 4 THEN 1 
        WHEN 3 THEN 2 
        WHEN 1 THEN 3 
        WHEN 5 THEN 4 
        WHEN 6 THEN 5 
       END AS query_name_here_sort_order 
      FROM CATEGORIES AS T1 
     ) AS T2 (
       ID, Category, 
       query_name_here_sort_order 
       ) 
ORDER 
    BY query_name_here_sort_order; 

Si l'ordre de tri est utilisé par plusieurs requêtes et/ou des applications puis ajouter à une colonne dans une table dans la base de données puis utilisez cette colonne dans votre requête.

0

Une deuxième façon de le faire (la première étant avec CASE WHEN ... THEN END comme déjà dit dans d'autres réponses) est:

ORDER BY ID=4 DESC, 
     ID=3 DESC, 
     ID=1 DESC, 
     ID=5 DESC, 
     ID=6 DESC