Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   SQL Stringfunktionen (https://www.delphipraxis.net/147016-sql-stringfunktionen.html)

lonskiswerk 31. Jan 2010 09:35

Datenbank: MySQL

SQL Stringfunktionen
 
Mit folgendem Code zeige ich alle Zeilen an, die die gleiche IP haben:

SQL-Code:
SELECT
  J.*
FROM
  (SELECT
     X.ip
   FROM
     data AS X
   GROUP BY
     X.ip
   Having Count(*) > 1)
INNER JOIN
  data AS J
ON
  X.ip = J.ip
Nun möchte ich gerne auf "ähnliche" IP's durchsuchen, also dass nur die ersten 3 IP-Blöcke gleich sein müssen, um die Zeilen anzuzeigen.

Ich würde das gerne über SQL lösen, ich weiß aber überhaupt nicht, ob sich das mit SQL internen String-Funktionen lösen lässt.

[edit=mkinzler]Angaben zur Datenbank ergänzt Mfg, mkinzler[/edit]

Bernhard Geyer 31. Jan 2010 09:38

Re: SQL Stringfunktionen
 
Welches DBMS?

mkinzler 31. Jan 2010 09:38

Re: SQL Stringfunktionen
 
Welches DBMS, bitte ergänze die Angaben
ZB. SUBSTRING(), SUBSTR()

DP-Maintenance 31. Jan 2010 09:39

DP-Maintenance
 
Dieses Thema wurde von "mkinzler" von "Programmieren allgemein" nach "Datenbanken" verschoben.
Es geht um Datenbanken

lonskiswerk 31. Jan 2010 09:44

Re: SQL Stringfunktionen
 
Danke für eure Antworten.

Es geht um MySQL. Ich habe mir 3 Funktionen rausgesucht:

POSITION('x' IN spalte)
SUBSTRING(spalte FROM x FOR y)
CHARACTER_LENGTH(spalte)

Mein Problem ist, dass POSITION nur die Position des 1. Punktes aus der IP liefern würde, ich brauche aber den letzten. Wenn ich ihn in den letzten 4 Zeichen mittels SUBSTRING suche, gibt es Probleme wenn die IP so aussieht: 87.154.1.1, denn dann findet er den 2. Punkt ...

Irgendwie scheitert es immer an einer Sache. :(

mkinzler 31. Jan 2010 09:49

Re: SQL Stringfunktionen
 
Die Funktion LOCATE() bietet die Möglichkeit einen Offset für die Suche zu setzen

lonskiswerk 31. Jan 2010 10:02

Re: SQL Stringfunktionen
 
Zitat:

Zitat von mkinzler
Die Funktion LOCATE() bietet die Möglichkeit einen Offset für die Suche zu setzen

Danke, aber das hilft mir irgendwie nicht wirklich weiter. :gruebel: Statt Locate hätte ich auch einfach Position und SubString benutzen können.

Jürgen Thomas 31. Jan 2010 12:04

Re: SQL Stringfunktionen
 
Hallo,

benutze zunächst REVERSE, dann die bereits genannten Möglichkeiten und zum Schluss (sofern für die Ausgabe erforderlich) nochmals REVERSE. Siehe MySql-Dokumentation: String-Funktionen

Gruß Jürgen

mkinzler 31. Jan 2010 12:08

Re: SQL Stringfunktionen
 
Da es eine definierte Anzahl von Punkten in einer IP-Adresse gibt, könnte REVERSE zum Ziel führen.

Aber Allgemein sollte Locate schon funktionieren

Wenn man die Position des 1. Punktes kennt kann man diese +1 als Offset verwenden

lonskiswerk 31. Jan 2010 13:54

Re: SQL Stringfunktionen
 
Danke, der Tipp mit Reverse war Gold wert. :D Im Nachhinein verstehe ich auch, wie ihr das mit Locate meintet, aber ich bevorzuge doch die Version mit Reverse.

SQL-Code:
SELECT
  J.*,
  (J.time2 - J.time1) AS diff1,
  (J.time3 - J.time1) AS diff2,
  (CHARACTER_LENGTH(J.ip)-POSITION('.' IN REVERSE(J.ip))+1) AS bis
FROM
  (SELECT X.ip FROM data AS X GROUP BY X.ip Having Count(*) > 1) As B
INNER JOIN
  data AS J
ON
  SUBSTRING(B.ip FROM 1 FOR bis) = SUBSTRING(J.ip FROM 1 FOR bis)
Er brechnet `bis` korrekt (ohne ON-Clause), mit ON-Clause bekomme ich folgenden Fehler:

SQL Error: Unknown column 'bis' in 'on clause'


Alle Zeitangaben in WEZ +1. Es ist jetzt 22:42 Uhr.
Seite 1 von 2  1 2      

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz