Verwendung von SQL ORDER BY für komplexe Kriterien
-
29-09-2020 - |
Frage
Nehmen wir an, meine Beziehung ist so
und ich wollte nach Rang sortieren, aber zuerst nach A und B.So wird meine Beziehung aussehen
Zuerst habe ich versucht, nur zwei Relationen zu haben, indem ich beide nach Rang ordne und dann die beiden Relationen zusammenfüge, aber am Ende werden sie einfach durcheinander gebracht.Ich habe auch versucht, Fälle zu verwenden, aber ich verstehe nicht, wie es funktioniert.Ich bekam immer wieder Fehlermeldungen über das Mischen von Zeichen mit ganzen Zahlen.
Bearbeiten:Ich habe vergessen zu erwähnen, dass ich nach einer etwas komplexen Anzahl von Ansichten am Ende die erste Beziehung oben habe.Ich habe zum Beispiel zwei Ansichten erstellt, eine mit nur den Klassen A und B, und diese dann nach Rang sortiert.Zweite Ansicht nur C-Klassen, geordnet nach Rang.Dann habe ich sie vereint, aber sie vermischen sich einfach.
Lösung
Sie brauchen nur eine CASE
Ausdruck in der ORDER BY
, um die Zeilen in zwei Gruppen zu unterteilen, sodass diejenigen mit der Klasse „A“ oder „B“ in die erste Gruppe eingefügt werden (1
) und alle anderen im zweiten (2
):
ORDER BY
CASE WHEN class IN ('A', 'B') THEN 1 ELSE 2 END,
rank ;
Andere Tipps
Ich werde Ihnen ein Beispiel für eine Möglichkeit geben, bei der ich CTEs verwende, die in vielen Datenbanken verfügbar sind, insbesondere in PostgreSQL, mit dem ich am besten vertraut bin.
CTEs und die WITH
Klausel
CTEs ermöglichen Ihnen die Bildung temporärer, tabellenähnlicher Einzelabfragestrukturen. Da Sie jedoch dafür sorgen können, dass CTEs in einer einzelnen Abfrage aufeinander angewiesen sind, bietet es eine bequeme und leicht verständliche Möglichkeit, Ihre Abfrage semi-prozedural zu gestalten.
In Deinem Fall würde ich es versuchen
WITH AB_results AS(
SELECT class, rank, 1 AS hidden_rank
FROM my_relation
WHERE class IN ('A','B')
),
Non_AB_results AS(
SELECT class, rank, 2 AS hidden_rank
FROM my_relation
WHERE class NOT IN ('A','B')
)
SELECT COALESCE(AB_results.class,Non_AB_results.class), rank
FROM AB_results
FULL OUTER JOIN Non_AB_results
USING(hidden_rank,rank)
ORDER BY hidden_rank, rank;
Ich werde hier in ein paar Minuten versuchen, eine SQLFiddle zusammenzustellen, nur um sicherzugehen, dass ich bei meiner Abfrage nicht einen Fehler gemacht habe.:P
BEARBEITEN:Mir ist ein kleiner Fehler unterlaufen.Ich versuche, es in einem Beispiel aufzuklären, während wir sprechen.
EDIT 2:Der Fehler ist nun behoben!Leider hat SQLFiddle im Moment ein kleines Problem, aber HIER ist der Link zur SQLFiddle für einige Tests.
bitte beachten Sie dass ich das vielleicht nicht auf die eleganteste Art und Weise gelöst habe, aber es sollte Ihre Probleme lösen.