SQL ORDER BY nur mit fixen String machbar?

D

DefconDev

Gast
Code:
ResultSet table_01 = statement.executeQuery("SELECT TOP 5 * FROM \"Karten_Siege\" ORDER BY "+this.mapName+" DESC");

Code:
ResultSet table_01 = statement.executeQuery("SELECT TOP 5 * FROM \"Karten_Siege\" ORDER BY \"this.mapName\" DESC");

Beide Statements lassen sich nicht realisieren. Im ersten Fall sagt er mir nur, "user lacks privilege or object not found: AKROPOLIS"

Der Spaltenname existiert , ich habe aber keine Ahnung warum AKROPOLIS komplett groß geschrieben wird.

Beim zweiten Stament sagt er mir nur das this.mapName nicht existiert.


Kann ich da keine variable einfügen nach ORDER BY?
 
Das ist mir klar, aber würde ich in PHP/MySQL einen Query wie "...ORDER BY "+this.mapName+" DESC" sehen, dann wüsste ich, wo der Hase im Pfeffer liegt. Ein zusätzliches ´ jeweils vor "+ und hinter +" wäre hier sicherlich die Lösung. Das wird bei dir nicht viel anders sein.

Zeig doch mal die Tabellenstruktur.
 
Code:
ResultSet table_01 = statement.executeQuery("SELECT TOP 10 * FROM \"Karten_Siege\" ORDER BY '"+this.mapName+"' DESC");

invalid ORDER BY expression

ist nun die Exception.

Karten_Siege.png

Achso, Akropolis taucht auch auf, ist aber nicht mehr im Bild enthalten.
Ergänzung ()

Achja, total vergessen. Es handelt sich um HSQLDB.
 
IMHO ist das Statement an sich schon quatsch, in karten_siege gibt es doch garantiert keine Spalte namens Akropolis sondern Akropolis ist der Name einer Karte, der in einer Spalte steht. Mach doch mal ein SELECT * FROM und guck was für Spalten da überhapt drin stehen.
 
Ich verstehe gerade die Aussage nicht?

Auf dem Bild ist doch deutlich zu erkennen dass die Spaltenköpfe wie die Karten heißen.

Oder ist der Spaltenkopf!=Spaltenname?
 
Lass mal die Anführungszeichen bei Karten_Siege und this.mapName weg.
 
Das lässt der Eclipse Compiler nicht zu.

Ich habe mir mal die Spaltennr und die zeilen nr ausgeben lassen.

Der index der Zeile beginnt bei 1.

Was mich etwas irritiert. Denn der Spaltenkopf müsste nach meiner Logik mit 0 beginnen oder?
 
Was genau wird bemängelt?
Lt. HSQLDB Doku werden keine Anführungszeichen benötigt.

Du meinst mit Index die ID? Das kann eine Einstellungssache sein, 1 ist aber normal für den 1. Eintrag. Das hat nichts mit dem Spaltenkopf zu tun.
 
Invalid Escape Funktion.


Wenn ich die Back-Slashs weglasse kommt bei der Exception "user lacks privilege or object not found: KARTEN_SIEGE"



System.out.println(table_01.getRow());

da wirft er mir eine 1 raus als erstes.


Gerade versuche ich mir die Spaltenkopfnamen ausgeben zu lassen. Selbst das stellt sich schwierig da.

Code:
table_01 = statement.executeQuery("SELECT COLUMN_NAME FROM ALL_TAB_COLUMNS WHERE TABLE_NAME= \"Karten_Siege\"");

Da fängt das Probloem bei ALL_TAB_COLUMNS an, obwohl das in der Oracle version zulässig ist.


Lasngam nervt das alles.
 
Hier mal meine Ideen:
1. Klappt das Query, oder kommt schon da eine Fehlermeldung?
Code:
SELECT TOP 5 * FROM \"Karten_Siege\"

2. Beide Strings gleich maskieren, entweder ' oder " benutzen
Code:
"SELECT TOP 10 * FROM 'Karten_Siege' ORDER BY '"+this.mapName+"' DESC"

3. ALL_TAB_COLUMNS ist halt Oracle-spezifisch, bei HSQL heisst die Tabelle halt anders:
http://stackoverflow.com/questions/9489050/show-columns-command-for-hsqldb
 
1. Ja, das klappt, das habe ich auch in anderen Klassen so abgefragt mit Top10. Diese ganzen Statements funktionieren bei mir solange keine variablen mit + anghängt werden.

2.
Code:
"SELECT TOP 10 * FROM 'Karten_Siege' ORDER BY '"+this.mapName+"' DESC"
Caused by: org.hsqldb.HsqlException: unexpected token: Karten_Siege

3. table_01 = statement.executeQuery("SELECT * FROM INFORMATION_SCHEMA.COLUMNS");

wenn ich das mache:

Code:
while(table_01.next()){
		System.out.println(table_01.findColumn("Akropolis"));
          }

Dann findet er auf einmal Akropolis nicht mehr.


table_01 = statement.executeQuery("SELECT TOP 10 * FROM \"Karten_Siege\"");

bei dem Statement findet er Akropolis.


Ich habe langsam den Eindruck es gibt einen Unterschied zwischen Spaltenkopfnamen und den Spalten!?
Ergänzung ()

Wenn irgendwer Interesse hat, kann ich den Code der Klasse posten und die Datenbank dazuhängen.
 
2. Hast du's auch mit \" versucht?

3. Es ist klar, dass er die Column "Akropolis" nicht findet, da es diese in INFORMATION_SCHEMA.COLUMNS nicht gibt. In dieser View werden alle Columns von allen Tabellen gespeichert. (Siehe auchhttp://www.mssqltips.com/sqlservertutorial/183/informationschemacolumns/, ist zwar für MSSQL, gilt aber glaub ich auch für HSQLDB).
Versuchs mal damit, da sollte Akropolis nebst allen andern Columns ausgegeben werden:
Code:
while(table_01.next()){
		System.out.println(table_01.findColumn("COLUMN_NAME"));
          }
 
2.
Code:
"SELECT TOP 10 * FROM 'Karten_Siege' ORDER BY \"this.mapName\" DESC"

So? Das habe ich auch schon versucht, da sagt er mir nur dass er das Object this.mapName nicht kennt. Also die selbe Exception wie wenn ich da Akropolis anzeige lasse.

3.

Code:
System.out.println(table_01.findColumn("COLUMN_NAME"));

in der Console wird nur der Wert 4 angezeigt.

Ka warum.
 
2.
So:
Code:
"SELECT TOP 10 * FROM \"Karten_Siege\" ORDER BY \"" + this.mapName + "\" DESC"
Du musst den String mit dem mapName zusammensetzen, Java ist nicht schlau genug, in "SELECT TOP 10 * FROM 'Karten_Siege' ORDER BY \"this.mapName\" DESC" das this.mapName mit dem aktuellen Wert zu ersetzen.

3. Mein Fehler, das table_01.findColumn("COLUMN_NAME") liefert den Index, an der wievielten Spalte sich die Column 'COLUMN_NAME' befindet (in diesem Fall an der 4. Stelle).
Mittels table_01.getString("COLUMN_NAME") wird der Wert aus dieser Spalte geliefert, da sollten dann alle Column-Names auftauchen
 
Du bist mein Held des Tages!!! 1 1/2 Tage habe ich in zwei Foren nach einer Lösung gesucht. Ich hatte schon mit Sketchup angefangen zu modelieren so frustiert war ich^^

Also nr. 2 ist die Lösung. Ganz verstehen tu ich es nicht warum Java das nicht mit normalen + einsetzen kann, aber gut.

3. hat mir auch sehr geholfen, ich kann mir endlich alle Column namen anschauen.


VIELEN DANK!!!!!! fast 50% deiner Post hast du hier gemacht :D Danke dass du dir die Mühe gemacht hast!
 
Kein Problem, ich weiss ja aus eigener Erfahrung, wie mühsam solche kleinen Details sein können ;)
Allerdings haben dich schon Daaron und Darlis auf die richtige Fährte mit den Anführungszeichen gelockt.

Genau weiss ich es auch nicht, ich rate aber mal, dass in HSQL (oder generell in SQL?) nur die gleichen Anführungszeichen in einem Query erlaubt sind, also entweder gar keine, ', oder ".
Hier hast du bei Karten_Siege " und bei mapName keine Anführungszeichen:
Code:
SELECT TOP 5 * FROM \"Karten_Siege\" ORDER BY "+this.mapName+" DESC

Weshalb keine Anführungszeichen und ' nicht funktioniert haben, kann ich dir auch nicht sagen, ist vielleicht ne Eigenheit von HSQL oder dem JDBC Treiber, bei anderen RDBMS funktioniert es jedenfalls.
 
Zurück
Oben