2010-07-21 12 views
32

Ich habe eine Tabelle mit den Kategorien:SQLite und kundenspezifischen Auftrag von

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

Nun würde Ich mag das Ergebnis der select-Anweisung zu

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

zum Beispiel bestellen. In MySQL würden Sie es so machen:

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

Wie würden Sie es in SQLite tun? Ich habe kein Feld "Bestellung von".

Antwort

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 zu mir, ich tippte es einfach aus. Die andere Möglichkeit besteht natürlich darin, ein Attribut zu erstellen, das als Priorität fungiert. Dann können Sie einfach nach der Priorität sortieren. Dies ist nicht der ideale Weg, sondern eine Lösung, die ich in der Vergangenheit anwenden musste. – northpole

+0

Für Geschwindigkeit mit großen Datensätzen würde ich wahrscheinlich eine indizierte Hilfstabelle erstellen, die die IDs und ihre gewünschte Reihenfolge enthält, und dann dagegen beitreten und nach ihrer indizierten Spalte sortieren. Nicht sicher, wie SQLite damit umgehen würde, aber "größere" DB-Engines würden wahrscheinlich davon profitieren, da der CASE-Ausdruck nicht optimal zum Bestellen ist. – Tomalak

1

Ich habe keine "order by" -Feld

Warum nicht?

Wenn dies der Fall ist, weil die Sortierreihenfolge anwendungsspezifisch ist, dann sortiere die Sortierung in der Anwendung und nicht in der Datenbank.

Wenn es ist, weil die Sortierreihenfolge spezifisch für genau diese eine Abfrage ist, dann verschlüsseln Sie es in der Abfrage, aber ich empfehle dringend, dass Sie dies für die aufrufende Anwendung transparent machen, z. (Standard-SQL-Syntax):

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; 

Wenn die Sortierreihenfolge durch mehrere Abfragen verwendet wird und/oder Anwendungen dann fügen Sie eine Spalte in einer Tabelle in der Datenbank dann diese Spalte in Ihrer Abfrage verwenden.

0

Ein zweiter Weg, der es (das erste erklärte, wie bereits in anderen Antworten mit CASE WHEN ... THEN END ist) zu tun ist:

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