SQL - Ergebnismenge speziell sortieren

Hi Leute,

zuerst mal: Ich bin mir nicht sicher, ob ich in diesem Forum richtig bin, falls es woanders besser aufgehoben ist bitte verschieben. ;)

So. Ich beschäftige mich seit ein paar Tagen mit SQL (Test-DB ist Oracle XE). Jetzt hab ich mich vorgestern an einer Sache festgebissen. Ich möchte meine Ergebnissmenge nach Department_ID sortieren, und zwar z.B. in der Reihenfolge 10, 30, 20. Das krieg ich mit nem normalen ORDER BY nicht hin. Ich geh seit vorgestern google auf die Nerven mit Suchanfragen, aber habs immer noch nicht hinbekommen. Vorhin bin ich bei DECODE gelandet, was auch interessant ist, aber für mein Problemschen nicht das gelbe vom Ei.

Das kann doch nicht so schwer sein! Hat da einer ein Stichwort für mich? Wär echt super!
Schönen Abend,
V:X
 
Hallo, wenn dein Department_ID nur die drei festen Werte enthält, kannst du aus dem Feld ein ENUM machen (das ist ein Feldtyp, der nur genau einen aus einer Menge von vorher definierten Werten enthalten kann).
Ein ENUM wird nämlich so sortiert, wie du die Werte definierst.
Also wenn das Feld als
Code:
Department_ID ENUM(10, 30, 20)
definiert ist und du nach dem Feld sortierst, müsste das passen.
http://dev.mysql.com/doc/refman/5.0/en/enum.html

Falls noch mehr Werte dazu kommen sollen (oder dir das ENUM nicht gefällt), kannst du auch einfach noch eine zusätzliche Tabelle anlegen, die als Primärschlüssel die Werte von Department_ID enthält und noch einen zusätzlichen (numerischen) Wert, der der Reihenfolge in der Sortierung entspricht.
Jetzt kannst du bei deinem Query einfach noch ein JOIN mit dieser Tabelle (über die Department_ID) machen und nach dem zusätzlichen "Sortierwert" sortieren.

mfg, metax.
 
Wenn es nicht zuviele Unterschiedliche Department_IDs gibt könntest du vieleicht einfach mehrere SELECTs mit einem UNION zusammenpacken?

SELECT ... WHERE Department_ID = 10
UNION
SELECT ... = 30
UNION
SELECT ... = 20

Das hab ich eben in der mysql-manual gefunden. Ob das auch in Oracle geht kann ich jetzt nicht sagen...
select * from pet order by field(species, 'cat', 'dog', 'bird') desc;
 
Hi,

danke erstmal euch beiden. Ihr habt mir beide weitergeholfen, wenn auch nicht bei diesem Problem :D

@metax.: soweit ich das nach gaaanz kurzem googlen sachen kann gibts bei Oracle kein ENUM. Trotzdem hab ich dadurch nen interessanten Blog-Eintrag gefunden, über das CHECK-Constraint, das ich vorher noch nicht kannte. (falls es jemanden interessiert, hier ist der Blod-Eintrag: http://thinkoracle.blogspot.com/2005/05/enum-in-oracle.html )

@Felixh: UNION bringt zwar die richtige Ergebnismenge, aber die Sortierung ist irgendwie immernoch in der Reihenfolge 10, 20, 30. Aber das UNION ist trotzdem ne coole Sache, hatte ich bisher auch noch nichts von gehört. Bin ja noch neu was Datenbanken angeht ;)
Mit dem FIELD hatte ich es schon versucht, das mochte Oracle aber nicht...

Ich habs jetzt mit einem
Code:
ORDER BY DECODE(department_id, '10', '10', '20', '30', '30', '20');
gemacht. Wenn 10, schreibe 10, wenn 20 schreibe 30 und wenn 30 schreibe 20. Ist ziemlich getrickst, aber der Output stimmt. Was will man mehr? :D

Also danke euch und bis demnächst,
V:X
 
das "problem" mit dieser art von problemstellung ist, das SQL != SQL

quasi jedes DBMS hat seinen eigenen SQL dialekt, daher sind derartige dinge in ihrer umsetzung je nach dialekt unterschiedlich ...

wenn du nun eine lösung für oracle hast, bedeutet das nicht, dass diese lösung auf jedem system funktioniert das einen SQL dialekt versteht ...

was du natürlich prinzipiell tun kannst um das sortierproblem zu lösen, wäre eine hilfstabelle, die dir zu den Department_IDs neue werte zuordnet die einer partiellen oder totalen ordnung genügen, und du statt nach der Department_ID dann nach diesen werten sortieren lässt ... das liefe auf einen join hinaus
 
Zuletzt bearbeitet:
Zurück
Oben