# Order by vs. compareToIgnoreCase



## arnd (15. Jul 2008)

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


----------



## SlaterB (15. Jul 2008)

mit
http://java.sun.com/j2se/1.5.0/docs/api/java/text/RuleBasedCollator.html
oder einem entsprechenden Eigenbau kannst du pro Zeichen die Wertigkeit angeben,

und das dürfte nötig sein, wenn hier die 1 größer ist als normale Buchstaben


----------



## The_S (15. Jul 2008)

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 (15. Jul 2008)

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 (15. Jul 2008)

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:

```
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;
...
```


----------

