"Christmas - the time to fix the computers of your loved ones" « Lord Wyrm

Datenbanken: Order BY bei einem String, welcher Zahlen repräsentiert?

semteX 22.07.2008 - 10:50 833 4
Posts

semteX

Risen from the banned
Avatar
Registered: Oct 2002
Location: Pre
Posts: 14350
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
Avatar
Registered: Sep 2004
Location: 1030
Posts: 1559
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.aspx


edit: sql oder t-sql, oder was anderes?

mat

Administrator
Legends never die
Avatar
Registered: Aug 2003
Location: nö
Posts: 25381
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

Risen from the banned
Avatar
Registered: Oct 2002
Location: Pre
Posts: 14350
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:

Code:
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
Avatar
Registered: Sep 2004
Location: 1030
Posts: 1559
nette lösung, thumbsUp
Kontakt | Unser Forum | Über overclockers.at | Impressum | Datenschutz