AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Datenbanken Telefonnummer in Datenbank Finden
Thema durchsuchen
Ansicht
Themen-Optionen

Telefonnummer in Datenbank Finden

Ein Thema von ajmbarros · begonnen am 3. Dez 2014 · letzter Beitrag vom 5. Dez 2014
Antwort Antwort
ajmbarros
(Gast)

n/a Beiträge
 
#1

Telefonnummer in Datenbank Finden

  Alt 3. Dez 2014, 17:03
Datenbank: Firebird • Version: 2.5 • Zugriff über: ibquery
Hallo,

ich möchte gerne eine Telefonnummer in einer Datenbank finden.
Kniffelig wird das ganze aber deswegen, weil es sich um ein VARCHAR(30) Feld handelt und über die Jahre sämtliche Zeichen die über Zahlen hinaus gehen verwendet wurden.

Ich habe mich gefragt ob es möglich ist das ganze mit Regulären ausdrücken zu bewältigen. Sprich: "is similar to".
Wie bereite ich aber den RegEx so vor, dass wenn z.B. die Telefonnummer "0123456" vorliegt ich auch "+49 (0) 12 3 45-6" finde aber auch "01234567" ausschließe?

Im Endeffekt brauch ich das für die Entwicklung einer TAPI Schnittstelle. Alle Telefonnummern Nachbearbeiten ist nicht möglich bzw. nicht gewünscht.

Gibt es dazu schon Lösungen, auch wenn es sich nicht um einen Regulären Ausdruck handelt?
Ich habe schon lange danach gesucht aber nichts vernünftiges gefunden. Auch den Ausdruck konnte ich nicht selbst bauen.

Bin für alle Vorschläge dankbar!
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.340 Beiträge
 
Delphi 12 Athens
 
#2

AW: Telefonnummer in Datenbank Finden

  Alt 3. Dez 2014, 17:11
Antwort:
* Wert auslesen
* alle Zusatzzeichen entfernen
* Vorwahl auflösen/einfügen
* das jeweils bei beiden Werten
* und danach kann man Beides problemlos vergleichen

Um schneller zu suchen, könntest du eine zusätzliche Spalte anlegen, welche z.B. per Trigger gefüllt/abgeglichen wird und wo die Daten der Tabelle bereits umgewandelt rumliegen.
Da geht dann das Suchen schneller und noch schneller mit Index darauf.

Oder halt eine eigene Vergleichsfunktion erstellen, welche zwei Werte bekommt, diese wie oben umformt und am Ende das Vergleichsergebnis zurückliefert.
Ein Therapeut entspricht 1024 Gigapeut.

Geändert von himitsu ( 3. Dez 2014 um 17:13 Uhr)
  Mit Zitat antworten Zitat
Der schöne Günther

Registriert seit: 6. Mär 2013
6.196 Beiträge
 
Delphi 10 Seattle Enterprise
 
#3

AW: Telefonnummer in Datenbank Finden

  Alt 3. Dez 2014, 17:15
Ich verstehe nicht. FireBird unterstützt doch mit SIMILAR TO reguläre Ausdrücke oder interpretiere ich das falsch?
http://www.firebirdsql.org/refdocs/l...ilding-regexps



Rofl:
Zitat:
: The following syntax defines the SQL regular expression format. It is a complete and correct top-down definition. It is also highly formal, rather long and probably perfectly fit to discourage everybody who hasn't already some experience with regular expessions (or with highly formal, rather long top-down definitions). Feel free to skip it and read the next section, Building regular expressions, which uses a bottom-up approach, aimed at the rest of us.
  Mit Zitat antworten Zitat
ajmbarros
(Gast)

n/a Beiträge
 
#4

AW: Telefonnummer in Datenbank Finden

  Alt 3. Dez 2014, 17:23
Reguläre ausdrücke werden unterstützt, aber:

Code:
select *
from Kontakte k
where k.tel is similar to '?'
Ich habe 0123456 als ausganswert.
Wenn ich genau die Telefonnumer suche entgehen mir die Nummern mit Sonderzeichen o.ä.

Es müsste, nach meinen Idealvorstellungen so sein (geht aber nicht):

Code:
select *
from Kontakte k
where regex(k.tel,'/d{1,}' = '0123456'
wobei "/d{1,}" für eine beliebige anzahl von Zahlen steht.

Oder es müsste eine Art von "Cast" funktionieren, aber auch das fand ich nicht.

Geändert von ajmbarros ( 3. Dez 2014 um 17:26 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.340 Beiträge
 
Delphi 12 Athens
 
#5

AW: Telefonnummer in Datenbank Finden

  Alt 3. Dez 2014, 17:44
Was gibt denn diese regex-Funktion für ein Ergebnis raus?

Entweder alle Zahlen-Funde, welche aus dem regex rauskommen, wieder zu einem String zusammensetzen

oder andersdrum könnte es auch gehn -> via Regex-Replace alles Ungültige entfernen


Aber, wie erwähnt, mußt du bei den Vorwahlen aufpassen

+49 (0) 351 666666
+49 351 666666
0351 666666
0049 351 666666
usw.

Entweder die verschiedenen Landesvorwahlen entfernen (wenn nur in Deuschland) oder die Vorwahlen vereinheitlichen.
Ein Therapeut entspricht 1024 Gigapeut.
  Mit Zitat antworten Zitat
ajmbarros
(Gast)

n/a Beiträge
 
#6

AW: Telefonnummer in Datenbank Finden

  Alt 3. Dez 2014, 22:40
Genau das ist mein Problem. Diese Funktion gibt es meines Wissens nicht. Die erste Variante existiert. Allerdings weiß ich nicht wie der regulärer Ausdruck gebaut werden könnte.
  Mit Zitat antworten Zitat
Benutzerbild von Sir Rufo
Sir Rufo

Registriert seit: 5. Jan 2005
Ort: Stadthagen
9.454 Beiträge
 
Delphi 10 Seattle Enterprise
 
#7

AW: Telefonnummer in Datenbank Finden

  Alt 3. Dez 2014, 22:43
Man sollte eben immer darauf aufpassen, wie die Daten in der Datenbank abgelegt werden. So wie es scheint ist die Telefonnummer stumpf als Text dort gespeichert worden, was sich nun rächt. Besser wäre es gewesen und ist es, solche Daten kontrolliert in die Datenbank zu schreiben.

Es ist unerheblich, in welcher Art diese in der Datenbank abgelegt werden, es muss nur eben reproduzierbar sein. Helfen kann dabei ein sogenanntes Bei Google suchenValueObject (in Delphi am einfachsten mit einem Record darstellbar).

Dieses ValueObject wird dann mit einem Konstruktor erzeugt und der lässt eben nur gültige Einträge zu. Gerade bei Rufnummern kann man da auch ein sehr schönes Konstrukt bauen, was dann abhängig vom aktuellen Kontext die Rufnummern ausgibt und auch annimmt.

Nehmen wir an wir befinden uns in Hamburg, dann ist der Kontext +49 40. Erzeugt man nun ein VO mit 123456 dann wird das intern und für die Datenbank als +49 40 123456 gespeichert. Bei einer Abfrage würde aber wieder nur 123456 herauskommen.

Die gleiche Rufnummer ergibt für den Kontext Berlin +49 30 dann 040 123456.

Im Übrigen gibt es hier im Forum ein bisserl Code von mir genau zu dem Thema Rufnummer Validierung und Formatierung. Einfach mal die Suche bemühen.
Kaum macht man's richtig - schon funktioniert's
Zertifikat: Sir Rufo (Fingerprint: ‎ea 0a 4c 14 0d b6 3a a4 c1 c5 b9 dc 90 9d f0 e9 de 13 da 60)
  Mit Zitat antworten Zitat
Antwort Antwort

 

Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 19:22 Uhr.
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz