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

Seite 1 von 1 - Forum: Coding Stuff auf overclockers.at

URL: https://www.overclockers.at/coding-stuff/datenbanken_order_by_bei_einem_string_welcher_zahl_197751/page_1 - zur Vollversion wechseln!


semteX schrieb am 22.07.2008 um 10:50

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


3mind schrieb am 22.07.2008 um 10:56

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 schrieb am 22.07.2008 um 11:02

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 schrieb am 22.07.2008 um 15:18

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.


3mind schrieb am 22.07.2008 um 15:19

nette lösung, thumbsUp




overclockers.at v4.thecommunity
© all rights reserved by overclockers.at 2000-2025