Suche nach Substring....
Moderator: Moderatoren
- satmax
- 1000 working lines a day
- Beiträge: 831
- Registriert: Do, 02. Dez 2010 19:34
- Wohnort: Biberbach in Österreich
- Hat sich bedankt: 1 Mal
- Danksagung erhalten: 1 Mal
- Kontaktdaten:
Suche nach Substring....
Ich habe eine DB wo die Telefonnummern in verschiedensten Formaten gespeichert sind:
+55 (555) 555555
055 5555 5555 -55
0055 55555/5555 (55)
Ich bekomme nun einen Anrufer via TAPI rein 0055555555555 und soll nun den entsprechenden Eintrag in der DB finden. Ideen?
Gibt es eine Art Stringremove in SQL damit ich alle nicht nummerischen Zeichen entfernen kann?
+55 (555) 555555
055 5555 5555 -55
0055 55555/5555 (55)
Ich bekomme nun einen Anrufer via TAPI rein 0055555555555 und soll nun den entsprechenden Eintrag in der DB finden. Ideen?
Gibt es eine Art Stringremove in SQL damit ich alle nicht nummerischen Zeichen entfernen kann?
Gruß
Markus
Markus
- satmax
- 1000 working lines a day
- Beiträge: 831
- Registriert: Do, 02. Dez 2010 19:34
- Wohnort: Biberbach in Österreich
- Hat sich bedankt: 1 Mal
- Danksagung erhalten: 1 Mal
- Kontaktdaten:
Re: Suche nach Substring....
Wobei das grundsätzlich funktioniert:
Aber ist halt nicht gerade super leserlich....
Code: Alles auswählen
select Telefon from Adressen
where replace(Replace(replace(replace(replace(TELEFON,' ',''),'(',''),')',''),'-',''),'/','') like'%5555555%'
Gruß
Markus
Markus
- nightcrawler
- 1000 working lines a day
- Beiträge: 655
- Registriert: Di, 24. Apr 2012 16:33
- Wohnort: 72184 Weitingen
- Hat sich bedankt: 3 Mal
- Danksagung erhalten: 96 Mal
- Kontaktdaten:
Re: Suche nach Substring....
Du musst Dir eine Funktion schreiben, welche die Telefonnummern normalisiert und die Normalisierung vergleichen. Am Schnellsten geht es, wenn die normalisierten Telefonnummern gespeichert sind und Du nur den Suchbegriff bei der Abfrage normalisieren musst.
- satmax
- 1000 working lines a day
- Beiträge: 831
- Registriert: Do, 02. Dez 2010 19:34
- Wohnort: Biberbach in Österreich
- Hat sich bedankt: 1 Mal
- Danksagung erhalten: 1 Mal
- Kontaktdaten:
Re: Suche nach Substring....
Normal ja, aber ich habe nur lesenden Zugriff auf diese DB. Also muss ich mich mit den vorhandenen Daten arrangieren...
Gruß
Markus
Markus
-
- Der Entwickler von "Deep Thought"
- Beiträge: 2518
- Registriert: Mi, 28. Jul 2010 17:16
- Hat sich bedankt: 12 Mal
- Danksagung erhalten: 77 Mal
Re: Suche nach Substring....
Wieviele Datensätze hat die Datenbank denn?
Bei Postgres gäbe es die REGEXP_REPLACE() Funktion zu Suche.....
Aber richtig schnell ist dies nicht, die Nummern in der Datenbank für die Suche normalisieren wäre der beste Weg ....
Du hast ja nicht nur das "nicht ZIffer" Problem sondern auch noch das + zu 00 Problem ....
Gruss Carlo
Bei Postgres gäbe es die REGEXP_REPLACE() Funktion zu Suche.....
Aber richtig schnell ist dies nicht, die Nummern in der Datenbank für die Suche normalisieren wäre der beste Weg ....
Du hast ja nicht nur das "nicht ZIffer" Problem sondern auch noch das + zu 00 Problem ....
Gruss Carlo
Valar Morghulis
Gruss Carlo
Gruss Carlo
- AUGE_OHR
- Marvin
- Beiträge: 12913
- Registriert: Do, 16. Mär 2006 7:55
- Wohnort: Hamburg
- Hat sich bedankt: 19 Mal
- Danksagung erhalten: 46 Mal
Re: Suche nach Substring....
hi,
bei Rufnummer würde ich die letzten 4 Stellen als Zahlenfolge für den Such-String nehmen und mit OrdwildSeek() in einen "vorbereiteten" Index suchen.
angenommen ein Feld Type "C",10
1.) alles was keine Zahl ist gehört nicht in den Index
2.) der IndexKey muss, wie das Feld, die selbe Länge (hier 10) haben
das mache ich nun mit allen Rufnummer Feldern
wie schon gesagt reichen meisten die letzten 4 Stellen der Rufnummer aus.
wenn es mehrere Treffer sind kann man auf 5 Stellen erweitern und innerhalb der Treffer weiter suchen
Antwort ist jetzt nicht SQL sondern xBase (alle Versionen)
bei Rufnummer würde ich die letzten 4 Stellen als Zahlenfolge für den Such-String nehmen und mit OrdwildSeek() in einen "vorbereiteten" Index suchen.
angenommen ein Feld Type "C",10
1.) alles was keine Zahl ist gehört nicht in den Index
2.) der IndexKey muss, wie das Feld, die selbe Länge (hier 10) haben
Code: Alles auswählen
FUNCTION TNR2STR( value )
LOCAL cRet := ""
LOCAL nLen := LEN( value )
LOCAL i, nDiff
LOCAL cStr
FOR i = 1 TO nLen
cStr := SUBSTR( value, i, 1 )
// ad 1.)
IF !EMPTY(VAL(cStr)) .or. cStr = "0"
cRet += cStr
ENDIF
NEXT
// ad 2.)
nDiff := nLen - LEN( cRet )
FOR i = 1 TO nDiff
cRet += CHR( 32 )
NEXT
RETURN cRet
Code: Alles auswählen
_tagname = "ALLETELNO"
_keyfeld = "TNR2STR(VORTELE)+" + ;
"TNR2STR(TELGES) +" + ;
"TNR2STR(VORFAX) +" + ;
"TNR2STR(TELFAX) +" + ;
"TNR2STR(VORPRIV)+" + ;
"TNR2STR(TELPRI) +" + ;
"TNR2STR(HANDY1) +" + ;
"TNR2STR(HANDY2) +" + ;
"TNR2STR(ANHANDY)+" + ;
"TNR2STR(PVVORT1)+" + ;
"TNR2STR(PVTEL1) +" + ;
"TNR2STR(PVVORF1)+" + ;
"TNR2STR(PVFAX1) +" + ;
"TNR2STR(PVHANDY)"
ORDCREATE( _cdxname, _tagname, _keyfeld )
CLOSE INDEX
wenn es mehrere Treffer sind kann man auf 5 Stellen erweitern und innerhalb der Treffer weiter suchen
gruss by OHR
Jimmy
Jimmy
- dtmackenzie
- Rekursionen-Architekt
- Beiträge: 265
- Registriert: Do, 22. Nov 2007 9:02
- Wohnort: Leipzig
- Hat sich bedankt: 66 Mal
- Danksagung erhalten: 22 Mal
- Kontaktdaten:
Re: Suche nach Substring....
Ich benutze folgende Funktion in unserer Postgres-Datenbank um Telefonnummern zu normalisieren:
Der Fall RETURN '49341'... ist spezifisch zu Leipzig (Nummer ohne Vorwahl).
Code: Alles auswählen
CREATE OR REPLACE FUNCTION public.tel_normalize(
telstr text)
RETURNS text
LANGUAGE 'plpgsql'
COST 100
VOLATILE PARALLEL UNSAFE
AS $BODY$
DECLARE
ts text := trim(telstr);
is_plus boolean := (left(ts, 1) = '+');
BEGIN
ts := regexp_replace(ts, '[^0-9]+', '', 'g'); -- Retain only digits
IF is_plus THEN
RETURN ts;
END IF;
IF left(ts, 2) = '00' THEN
RETURN substr(ts, 3);
END IF;
IF left(ts, 1) = '0' THEN
RETURN '49' || substr(ts, 2);
END IF;
RETURN '49341' || ts;
END;
$BODY$;
Viele Grüße,
David
David