SQL Sortierung (ohne Order By)

gfeschu

Ensign
Registriert
Aug. 2010
Beiträge
147
Hallo zusammen

Ich habe ein doofes Problem. Ich greife auf eine DB zu die ich nicht verändern kann.
Die Werte in einer Spalte muss ich aber sortieren. Es gibt drei Werte die wie folgt beginnen: ("I%", "P%" und "T%").

Die Abfrage sollte zuerst alle Einträge mit "P" am Anfang dann mit "I" und schliesslich mit "T" ausgeben. Beim Order By geht das ja nicht soweit ich weiss, da das "P" im Alphabet zwischen den anderen zwei Buchstaben liegt...

Kann man das per SQL überhaupt realisieren?

Vielen Dank für eure Mühe.

Gruss gfeschu
 
Wie kommst du darauf, daß du "ORDER BY" nicht benutzen kannst? Eine Anfrage per "SELECT" verändert per Definition an der Tabelle nichts.

Alternativ bleibt dir nichts anderes übrig als es entweder programmatisch nach dem Query selbst zu sortieren oder eben jede Möglichkeit einzeln aus der Tabelle zu holen.
 
Hi,

eine Möglichkeit wäre ein UNION.
ist aber eher Quick and Dirty

Dabei machst Du drei abfrage.
etwa so...
select * from ABS where Spalte like 'P%'
union
select * from ABS where Spalte like 'I%'
union
select * from ABS where Spalte like 'T%'
 
Hi,

er kann "Order By" deswegen nicht benutzen, weil er keine aufsteigende Reihenfolge will sondern erst alle mit "P" am Anfang, dann alle mit "I" und danach alle mit "T". "Order By" macht erst "I", dann "P" und dann "T".

Ich schlage dir "Union Select" vor.

Code:
SELECT * 
FROM [TABELLE] 
WHERE [SPALTE] LIKE 'P%' 
UNION SELECT * 
FROM [TABELLE] 
WHERE [SPALTE] LIKE 'I%' 
UNION SELECT * 
FROM [TABELLE] 
WHERE [SPALTE] LIKE 'T%'

VG,
Mad
 
Welche Datenbank? Denn bei MySql könnte man sagen, dass erst nach =p dann =i und dann =p sortiert wird
 
Hallo,

du kannst das so machen:

PHP:
select * from Tabelle
order by 
case when substring(Spaltenname,1,1) like 'P%' then 1
 when substring(Spaltenname,1,1) like '#I%' then 2
when substring(Spaltenname,1,1) like 'T%' then 3
end

Hoffe das hilft dir weiter.

Grüße
ratze
 
Zuletzt bearbeitet:
Sorry hab mich etwas falsch ausgedrückt mit dem "ohne Order By". Ich meinte damit nur, dass die Sortierung anhang ASC und DESC nicht funktioniert.

Ich habe zurzeit folgende Abfrage:

Code:
SELECT 
	* 
FROM 
	TABLE 
ORDER BY TESTDATE DESC, TESTSYSTEM

Geht das Order By Field oder das mit den Case auch wenn ich zwei Order By besitze? Falls ja, wie sieht der Syntax aus?
Es ist eine Oracle Datenbank.


Danke für eure vielen Antworten.
 
FIELD und LEFT gibt es afaik nur in MySQL.

Für Oracle können die Funktionen substr und instr genutzt werden.
substr(s,m[,n]) Teilstring von s ab Stelle m, n Zeichen lang (n nicht angegeben => bis Stringende)
instr(s1, s2[,n[,m]]) suche s2 in s1 und zwar ab der n-ten Stelle das m-te Auftreten (Defaultwerte für n und m sind 1), Ergebnis ist die gefundene Position in s1 oder 0

Das ganze kann man dann als normales Order-Statement verknüpfen:
Code:
order by O1, O2, O3, ...

Beispiel:
order by fieldname asc, date desc, instr(substr(name,0,1),"PIT")
 
Danke für die Antwort.

Wenn ich folgender Code habe:

Code:
ORDER BY TESTDATE DESC, instr(substr(TESTSYSTEM,0,1),"PIT")

Kommt nur ein Oracle Fehler. ORA-00904: "PIT": invalid identifier
Wenn ich die Klammern ändere auf ' wird das Query zwar ausgeführt, aber es wird nichts sortiert. Wenn ich nur 'P' nehme kommen zwar Werte sortiert zurück, aber TIP und nicht PIT.
Auch wenn ich auch noch Testsystem ASC oder DESC nehme ists nit P-I-T...

Mach ich was falsch? ^^

Gruss Gfeschu
 
Hallo.

ändere den Code von Ratze79 in

PHP:
select * from Tabelle
order by case 
when substr(Spaltenname,1,1) like 'P%' then 1
when substr(Spaltenname,1,1) like 'I%' then 2
when substr(Spaltenname,1,1) like 'T%' then 3
end
 
Zuletzt bearbeitet: (Formatierung)
nApfelkuchen+SL hat das schon vollkommen korrekt beschrieben, ich versteh nicht so ganz warum hier so kompliziert gedacht wird wenn 2 Unions reichen O.o
Ich meine geschwindigkeitstechnisch wird sich das alles nicht viel nehmen, aber wenn ich die Wahl habe nehme ich doch lieber ein Union, dass auf allen DBs funktioniert, statt irgendwelche proprietären Oraclefunktionen -.-
 
@Mambokurt

Apfelsaft hat ja selber gesagt, dass diese Lösung eher quick & dirty ist.

@Rest

Problem gelöst. Danke vielmals für eure Hilfe!
 
Zurück
Oben