Datenbank char Feld sortieren (IP-Adressen)
joao
- datenbank
0 Vinzenz Mai
Hallo,
bei einer Datenbank habe ich eine Anzahl von IP-Adressen. Die ersten beiden Dezimalzahlen sind bei allen IP-Adressen gleich, es unterscheiden sich nur die letzten beiden Dezimal Zahlen (X).
1.1.XXX.XXX
Diese IP-Adresse würde ich jetzt gerne sortieren, so das ich folgende Ausgabe erhalte
1.1.48.1
1.1.48.2
.
.
.
1.1.49.1
Zur Zeit habe ich folgende Sortierung
1.1.48.100
1.1.48.101
.
.
.
1.1.48.21
die ich durch den folgenden Befehl erhalte
$such = "SELECT * FROM bewohner";
$such .= " WHERE bau LIKE '$Bau'";
$such .= " ORDER by LPAD(IP,15,'0')";
Ich habe schon gesucht, aber bisher keine richtige Lösung des Problems gefunden. Ich würde das ganze auch gerne als Char belassen und nicht zu einem INT umwandeln.
Hallo,
bei einer Datenbank habe ich eine Anzahl von IP-Adressen. Die ersten beiden Dezimalzahlen sind bei allen IP-Adressen gleich, es unterscheiden sich nur die letzten beiden Dezimal Zahlen (X).
welches Datenbankmanagementsystem (DBMS), welche Version?
1.1.XXX.XXX
Diese IP-Adresse würde ich jetzt gerne sortieren, so das ich folgende Ausgabe erhalte
1.1.48.1
1.1.48.2
.
.
.
1.1.49.1Zur Zeit habe ich folgende Sortierung
1.1.48.100
1.1.48.101
.
.
.
1.1.48.21
Ich habe schon gesucht, aber bisher keine richtige Lösung des Problems gefunden. Ich würde das ganze auch gerne als Char belassen und nicht zu einem INT umwandeln.
Konsultiere das Handbuch Deines DBMS, schau Dir die Zeichenkettenfunktionen an. Extrahiere aus diesen die Werte des dritten und vierten Oktetts. Wandle diese mit Hilfe von CAST in Integer um. Sortiere zuerst nach dem dritten Oktett, dann nach dem vierten Oktett.
Wenn Dein DBMS keine Indexe auf berechnete Spalten unterstützt, wird das ganze nicht besonders gut skalieren.
Du könntest zwar die Oktette mit führenden Nullen ergänzen, was Deine Sortierung dramatisch vereinfacht - aber handelsübliche Software interpretiert die Oktette derartig dargestellter IP-Adressen als Oktalzahlen mit unerwünschten Ergebnissen.
Freundliche Grüße
Vinzenz
Es handelt sich MYSQL
Ich habe mir gedacht das ich das ganze vielleicht mit einem CAST machen könnte, doch wenn ich CAST[IP AS DEZIMAL] mache, dann wählt er nur die zahlen bis zum zweiten Punkt aus, also die 1.1 und der rest wird nicht beachtet.
Gibt es da eine Möglichkeit, das alles beachtet wird oder würde es auch reichen wenn er nicht die ersten zahlen nehmen würde, sondern nur die lezten.
Mahlzeit Joao,
doch wenn ich CAST[IP AS DEZIMAL] mache, dann wählt er nur die zahlen bis zum zweiten Punkt aus, also die 1.1 und der rest wird nicht beachtet.
Wer lesen kann, ist klar im Vorteil:
Extrahiere aus diesen die Werte des dritten und vierten Oktetts. Wandle diese mit Hilfe von CAST in Integer um.
Natürlich wird es nicht funktionieren, wenn Du die IP-Adresse als ganzen in eine Zahl zu verwandeln versuchst - wie auch? Du musst die einzelnen Oktette separat umwandeln.
MfG,
EKKi
Natürlich wird es nicht funktionieren, wenn Du die IP-Adresse als ganzen in eine Zahl zu verwandeln versuchst - wie auch? Du musst die einzelnen Oktette separat umwandeln.
Eine Einfachere Möglichkeit wäre aber sehr schön gewesen, dann mach ich mich mal daran.
Hallo,
Natürlich wird es nicht funktionieren, wenn Du die IP-Adresse als ganzen in eine Zahl zu verwandeln versuchst - wie auch? Du musst die einzelnen Oktette separat umwandeln.
Eine Einfachere Möglichkeit wäre aber sehr schön gewesen, dann mach ich mich mal daran.
ach so, MySQL soll also wissen, dass Du das dritte und vierte Oktett haben willst. Woher denn?
Freundliche Grüße
Vinzenz
Hi,
Eine Einfachere Möglichkeit wäre aber sehr schön gewesen, dann mach ich mich mal daran.
ach so, MySQL soll also wissen, dass Du das dritte und vierte Oktett haben willst. Woher denn?
es geht doch hier um die Sortierung der ganzen IP-Adresse, nicht nur des 3. und 4. Oktetts. Dazu eignet sich die Funktion INET_ATON(), die eine IP von dotted decimal in einen Integer-Wert umwandelt:
... ORDER BY INET_ATON(IP)
dein Hinweis, dass das Ganze nicht sonderlich gut skalieren wird ist natürlich weiterhin zu beachten.
Gruß,
Andreas.