Order by vs. compareToIgnoreCase

Status
Nicht offen für weitere Antworten.

arnd

Mitglied
Hallo,
bei einer anwendung die ich derzeit programmiere stellt sich folgendes Problem.
Das SQL statement "ORDER BY" sortiert anders, als compareToIgnoreCase()
Beispiel zum nachvollziehen:
SELECT * FROM test ORDER by name ASC
A1------"".compareToIgnoreCase("A1")=>-2 //Anfang - ist egal...
A10----"A1".compareToIgnoreCase("A10")=>-1
A2-----"A10".compareToIgnoreCase("A2")=>-1
A25---"A2".compareToIgnoreCase("A25")=>-1
A3-----"A25".compareToIgnoreCase("A3")=>-1
b0-----"A3".compareToIgnoreCase("b0")=>-1
C1-----"b0".compareToIgnoreCase("C1")=>-1
1b------"C1".compareToIgnoreCase("1b")=>50 //hier "sortiert" java anders als SQL
1B-----"1b".compareToIgnoreCase("1B")=>0
10B----"1B".compareToIgnoreCase("10B")=>50 //hier auch!


Da ich auf garkeinen fall das Ergebnis von der datenbank umsortieren will (zu groß) - wie kann ich einen Stringvergleich machen, der genau so vergleicht, wie die Sortierung von SQL?

Grüße und spaß beim tüfteln ;-)
Arnd
 

The_S

Top Contributor
Dazu müsste man genau wissen, wie SQL sortiert. Weißt du das?

Aus deinen Beispielen lässt sich wohl erkennen, dass SQL eine Zahl weiter vorne als einen Buchstaben einordnet und dass es bei Java andersrum ist. Wenn es dabei bleibt, sollte es ein leichtes sein, einen eigenen Comparator zu schreiben.

Generell: Was du von der Datenbank erledigen lassen kannst, dass lass auch durch die Datenbank erledigen und nicht durch dein Programm.
 

arnd

Mitglied
ich weiß eben nicht, wie die Datenbank sortiert - aber: ich denke doch, dass es auch in SQL standard gibt - an die sich möglicherweise sogar ein paar halten.

Muss leider sowohl in der Datenbank sortieren, als auch in meiner Applikation. Vlt. fällt mir noch was ein es zu umgehen.
Ich werde mich wohl mal am "rule-based" sortieren probieren.
Für spätere googler:
Die Klasse Strings.java bietet eine wunderschöne natürliche sortierung - aber leider hilft mir das auch nicht...
 

arnd

Mitglied
Also zur Lösung:
ich hätte mit einen eigenen comparator machen können... allerdings habe ich erfahren, dass - je nach Datenbankhersteller leichte unterschiede in der sortierung sind. Wenn ich micht nicht darauf verlassen kann, dass meine Datenbank sich auf immer und ewig gleich verhält - habe ich den ratschlag angenommen: entweder alles in der DB oder in java. Auch wenn es absolute speicher und prozessorzeitverschwendung ist - ich kopier mir das gesamte resultset in rein un kopiere es dann. Zum nachmachen:
Code:
ResultSet rsTarget=dbTarget.excecuteQuery("SELECT * FROM tw_project_data ORDER by name ASC");
boolean tgt;
TreeMap<String, String[]> sTarget=new TreeMap<String, String[]>(str_com);
while (rsTarget.next())
{
    sTarget.put(rsTarget.getString(1), Database.getStringArray(rsTarget));
}
Iterator <String []> tgtdata=sTarget.values().iterator();
tgt=tgtdata.hasNext();
String [] target=tgt ? tgtdata.next() : null;
...
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
T SQL ORDER BY Softwareentwicklung 1

Ähnliche Java Themen

Neue Themen


Oben