Suche nach Substring....

SQL Express von Boris Borzic

Moderator: Moderatoren

Antworten
Benutzeravatar
satmax
1000 working lines a day
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....

Beitrag von satmax »

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?
Gruß
Markus
Benutzeravatar
satmax
1000 working lines a day
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....

Beitrag von satmax »

Wobei das grundsätzlich funktioniert:

Code: Alles auswählen

select Telefon from Adressen
where replace(Replace(replace(replace(replace(TELEFON,' ',''),'(',''),')',''),'-',''),'/','')  like'%5555555%'
Aber ist halt nicht gerade super leserlich....
Gruß
Markus
Benutzeravatar
nightcrawler
Rekursionen-Architekt
Rekursionen-Architekt
Beiträge: 486
Registriert: Di, 24. Apr 2012 16:33
Wohnort: 72184 Weitingen
Hat sich bedankt: 1 Mal
Danksagung erhalten: 37 Mal
Kontaktdaten:

Re: Suche nach Substring....

Beitrag von nightcrawler »

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.
--
Joachim
Joachim Dürr Softwareengineering
https://www.jd-engineering.de
Benutzeravatar
satmax
1000 working lines a day
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....

Beitrag von satmax »

Normal ja, aber ich habe nur lesenden Zugriff auf diese DB. Also muss ich mich mit den vorhandenen Daten arrangieren...
Gruß
Markus
ramses
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 2314
Registriert: Mi, 28. Jul 2010 17:16
Hat sich bedankt: 10 Mal
Danksagung erhalten: 46 Mal

Re: Suche nach Substring....

Beitrag von ramses »

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
Valar Morghulis

Gruss Carlo
Benutzeravatar
AUGE_OHR
Marvin
Marvin
Beiträge: 12697
Registriert: Do, 16. Mär 2006 7:55
Wohnort: Hamburg
Hat sich bedankt: 12 Mal
Danksagung erhalten: 18 Mal

Re: Suche nach Substring....

Beitrag von AUGE_OHR »

hi,
satmax hat geschrieben: Do, 13. Dez 2018 17:57 Gibt es eine Art Stringremove in SQL damit ich alle nicht nummerischen Zeichen entfernen kann?
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
das mache ich nun mit allen Rufnummer Feldern

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
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
gruss by OHR
Jimmy
Benutzeravatar
dtmackenzie
Rekursionen-Architekt
Rekursionen-Architekt
Beiträge: 199
Registriert: Do, 22. Nov 2007 9:02
Wohnort: Leipzig
Hat sich bedankt: 47 Mal
Danksagung erhalten: 7 Mal
Kontaktdaten:

Re: Suche nach Substring....

Beitrag von dtmackenzie »

Ich benutze folgende Funktion in unserer Postgres-Datenbank um Telefonnummern zu normalisieren:

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$;
Der Fall RETURN '49341'... ist spezifisch zu Leipzig (Nummer ohne Vorwahl).
Viele Grüße,
David
Antworten