Das nächste Entwicklertreffen findet Anfang Mai in Münster statt - weitere Infos bzw. zur Anmeldung!

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: 822
Registriert: Do, 02. Dez 2010 19:34
Wohnort: Biberbach in Österreich
Kontaktdaten:

Suche nach Substring....

Beitrag von satmax » Do, 13. Dez 2018 17:57

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: 822
Registriert: Do, 02. Dez 2010 19:34
Wohnort: Biberbach in Österreich
Kontaktdaten:

Re: Suche nach Substring....

Beitrag von satmax » Do, 13. Dez 2018 18:11

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: 321
Registriert: Di, 24. Apr 2012 16:33
Wohnort: 72184 Weitingen
Kontaktdaten:

Re: Suche nach Substring....

Beitrag von nightcrawler » Do, 13. Dez 2018 18:15

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: 822
Registriert: Do, 02. Dez 2010 19:34
Wohnort: Biberbach in Österreich
Kontaktdaten:

Re: Suche nach Substring....

Beitrag von satmax » Fr, 14. Dez 2018 7:50

Normal ja, aber ich habe nur lesenden Zugriff auf diese DB. Also muss ich mich mit den vorhandenen Daten arrangieren...
Gruß
Markus

ramses
Programmier-Gott
Programmier-Gott
Beiträge: 1228
Registriert: Mi, 28. Jul 2010 17:16

Re: Suche nach Substring....

Beitrag von ramses » Fr, 14. Dez 2018 21:51

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

Benutzeravatar
AUGE_OHR
Marvin
Marvin
Beiträge: 11718
Registriert: Do, 16. Mär 2006 7:55
Wohnort: Hamburg

Re: Suche nach Substring....

Beitrag von AUGE_OHR » Sa, 15. Dez 2018 0:53

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

Antworten