Datenbanken: Order BY bei einem String, welcher Zahlen repräsentiert?
semteX 22.07.2008 - 10:50 877 4
semteX
begehrt die rostschaufel
|
Folgendes problem, ich muss geordnet aus ner datenbank ausgeben =>
"Andi" "Franz" "Berni" sortiert er richtig und das passt
"1", "2", ... "10" sortiert er "falsch", da kommt 1, 10, 2, 3, ... dabei raus
wie umgeh ich das ganze? da das feld sowohl zahlen als auch wörter enthält ist ne konvertierung nach integer ned möglich.
thx semteX
edit: lösungen übers hibernate3 sind natürlich auch sehr willkommen
Bearbeitet von semteX am 22.07.2008, 10:55
|
3mind
mimimi
|
da du mit einem einfachen cast natürlich sofort in die exception läufst könntest erst noch mit isnumeric überprüfen ob es sich um eine zahl handelt, und dann eben casten. hth http://msdn.microsoft.com/de-de/library/ms186272.aspxedit: sql oder t-sql, oder was anderes?
|
mat
AdministratorLegends never die
|
Ein weiteres Feld mit dem Typ Integer in die Tabelle einfügen. Die Strings kommen dann in das vorhandene Feld, Integer ins Neue. Das Query ist dann ORDER BY stringfeld, integerfeld. Die Position der gelisteten Integers kann dann mit dem Wert des Stringfeldes oder noch allgemeiner mit einer weiteren sortid (1 = string, 2 = integer und dann ORDER BY sortid,stringfeld,integerfeld) reguliert werden.
|
semteX
begehrt die rostschaufel
|
beides sehr gute lösungen, der einserkandidat war in dem fall allerdings der DKCH via IM: Im Hibernate mapping kann man bei nem Set angeben, wie es sortiert werden soll. Funktioniert über <set ... sort="package.SuperSortAlgoLoL" </set> der SuperSortAlgoLoL muss das Interface Comparator implementiern und dann is ma eigentlich scho komplett gerüstet. schaut jetzt so aus: public class SuperSortAlgoLoL implements Comparator<DivisionBO> {
public int compare(DivisionBO d1, DivisionBO d2) {
try {
Integer i1 = Integer.parseInt(d1.getName());
Integer i2 = Integer.parseInt(d2.getName());
return i1.compareTo(i2);
} catch (NumberFormatException nfe) {
return d1.getName().compareTo(d2.getName());
}
}
}
er versucht somit erst mal die Integer zu parsen, wenn das fehlschlägt weil einer der werte ein String ist macht er den fallback auf String vergleich. Funktioniert tadellos. edit: ich wollt das problem eigentlich ueber pures SQL loesen, darum hab ich das hibernate auch nur im edit dazu geschrieben. da es hibernate aber so "schön" gmacht hat, hab ich das natürlich genützt. edit2: mats lösung wär nur schwer gangen, weil die datenbank im wesentlichen schon steht => war so weniger aufwand.
Bearbeitet von semteX am 22.07.2008, 15:21
|
3mind
mimimi
|
nette lösung, thumbsUp
|