![]() |
Datenbank: SQLite • Version: 3.x • Zugriff über: Unidac
Zeichen bei SELECT ignorieren
Hallo,
ist es möglich mit SQL eine Abfrage über String-Felder zu machen und dabei bestimmte Zeichen zu ignorieren bzw. nur nach Zahlen zu suchen? Konkret geht es mir darum in Telefonnummern zu suchen. Die Nummer inkl. Vorwahl bekomme ich ohne führende Null als reine Zahlenzeichenkette. In der DB sind aber auch Zeichen (+/...) abgespeichert. Danke! |
AW: Zeichen bei SELECT ignorieren
Hai fillibuster,
ich würde nicht versuchen zeichen zu ignorieren sondern die Daten in der Tabelle in eine vernünftige Form zu bringen. Also drei Felder für eine Telefonnumemer LKZ - Landeskennzahl ohne nullen oder so (z.B. 49 für Deutschland, 1 für USA/Nordamerika, 44 für England) OKZ - Ortskennzahl auch ohne nullen (z.B. 89 für München, 69 für Frankfurt) Nummer - Die Nummer des Teilnehmers. Dann kannst Du vernünftig suchen. Anstelle der LKZ würde es sich auch anbieten eine Tabelle mit allen LKZ anzulegen und bei dem "Kontakt" dan nur die ID der LKZ aus der Tabelle zu verwenden. |
AW: Zeichen bei SELECT ignorieren
@Sharky
Da träumt aber manche "prof. Personen Daten Verwaltung" von. @fillibuster eine andere Möglichkeit wäre es die Tel.Nummern gleich richtig zu speichern: +49 811 1234567 Gruß K-H |
AW: Zeichen bei SELECT ignorieren
Hallo,
die Tabelle jetzt noch umzuformen ist nicht möglich. Die einzige Möglichkeit, die in der Richtung funktionieren würde, wäre ein zusätzliches Feld und alle Nummern bereinigt eintragen. Das ist selbst aber für den konkreten Fall viel zu umständlich, deshalb: gibt es eine Möglichkeit mit SQL Nummern zu suchen und dabei alle anderen Zeichen zu ignorieren? Viele Grüße ... BTW: Ich glaube beim Speichern von Telefonnumern gibt es min. 25 Ansichten, wie es richtig geht ;-) |
AW: Zeichen bei SELECT ignorieren
Erstelle Dir in SQL eine Function, welche ein vergleichbares Format hervorbringt und nutze diese.
|
AW: Zeichen bei SELECT ignorieren
Zitat:
Code:
das könnte weiter helfen.
select irgendwas
from meinetabelle where satz like '['+','-']['0'..'9']__%' Zitat:
![]() Gruß K-H |
AW: Zeichen bei SELECT ignorieren
Ich bereite mir den Suchstring für die Telefonnummer, die von der Telefonanlage kommt folgendermaßen auf, um sie dann in meiner Datenbank zu suchen:
Delphi-Quellcode:
for i := 1 to Length(TelNr) do
begin SuchTel := SuchTel + '%' + TelNr[i]; end; SuchTel := SuchTel + '%'; lSQL.Add('WHERE Telefon1 like ' + StrToSQL(SuchTel)); lSQL.Add(' OR Telefon2 like ' + StrToSQL(SuchTel)); lSQL.Add(' OR MobilTel like ' + StrToSQL(SuchTel)); |
AW: Zeichen bei SELECT ignorieren
Das bringt doch nichts, wenn die gespeicherte Nummer z.B. '01 23 45' lautet und Du nach '012345' suchst.
Da SQLLite verwendet wird, scheint die Datenmenge nicht sonderlich groß zu sein. Also alles in den Speicher, dann suchen und fettig.
Delphi-Quellcode:
Sind halt 2 Queries. Die erste Query liefert alle Telefonnummern und die Record-ID. Dann wird eine Liste von IDs der Records erzeugt, deren Telefonnummer past und anschließend werden nur diese Records gelesen.
Query.Text := 'Select ID,Telefonnummer from Tabelle';
Query.Open(); While not Query.EOF do begin if PhoneNumberMatches(MySearchString, Query['Telefonnummer']) Then Results := Results + Query['ID']+','; Query.Next; End; if Results<>'' then begin setlength (Results, Length (Results) - 1); Query.Close; Query.Text := 'Select * from Tabelle where ID in ('+Results+')'; Query.Open; Mit einem anderen RDBMS kann man sich eine mehr oder minder komplexe Funktion (UDF) erstellen, das Matchen übernimmt, aber mit SQLite geht das eben nicht. |
AW: Zeichen bei SELECT ignorieren
Das stimmt so nicht ganz, aber der Aufwand dürfte abschrecken (
![]() |
AW: Zeichen bei SELECT ignorieren
Nicht schön aber selten, könnte es vllt. nur in SQL auch so gehen:
SELECT * FROM Tabelle WHERE replace(replace(replace(replace(Telefonnumer,'+',' '),'-',''),'/',''),' ','') LIKE '%12345%' Das ist jetzt wie man das in Oracle machen könnte. Laut der Doku im Link von DeddyH kennt SQL zumindest eine replace Funktion. Keine Ahnung was man bei SQL Light für Platzhalterzeichen statt % verwendet. |
AW: Zeichen bei SELECT ignorieren
Zitat:
|
AW: Zeichen bei SELECT ignorieren
Ich hatte vor einiger Zeit ebenfalls das Vergnügen mich mit Telefonnummern herum zu schlagen.
Nach einer Woche Hampelei mit Berücksichtigung von deutschen,amerikanischen,englischen und Sekretärinenvorlieben (alles natürlich wohlbegründet und jede Änderung ein Verstoß gegen die Menschenrechte) hat ein netter Mensch mit der Faust auf den Tisch gehauen, und ein Standardformat definiert. Die Umstellung war nach 2 Stunden (mit Delphi) erledigt. Jetzt läuft jede Woche eine Prüfabfrage die eine Fehlerliste generiert und gut ist. Gruß K-H |
AW: Zeichen bei SELECT ignorieren
Hi,
erstmal danke für eure Antworten. Da teste ich mir das Passende raus. Hatte gestern festgestellt, dass die folgende Abfrage auch funktioniert:
Code:
für z. B. +49 (30) 123 456. Ist ja bald Halloween :shock: *grusel*
SELECT * FROM contact WHERE phone LIKE '%3%0%1%2%3%4%5%6'
Viele Grüße ... |
AW: Zeichen bei SELECT ignorieren
Zitat:
|
AW: Zeichen bei SELECT ignorieren
Hi,
Zitat:
Danke euch :thumb: |
AW: Zeichen bei SELECT ignorieren
Zitat:
|
AW: Zeichen bei SELECT ignorieren
Zitat:
|
AW: Zeichen bei SELECT ignorieren
Zitat:
Ich stehe auf dem Standpunkt, das ein Problem, das ordentlich lösbar ist, auch ordentlich gelöst werden sollte. PS: Als Lösung für die Eingabe kompletter Telefonnummern mag es als Notbehelf durchgehen, ich würde die paar Daten (da sie ja überschaubar sind) trotzdem in-Memory filtern, und dann richtig. |
AW: Zeichen bei SELECT ignorieren
Ich habe in meiner Datenbank das Problem, dass ein und die selbe Telefonnummer mehr als einmal in der Datenbank drin stehen kann.
z.B. 1. Hans Müller als Kunde mit Telefonnummer 2. Hans Müller als Ansprechpartner seiner Firma mit Privatnummer 3. Hans Müller als Ansprechpartner seiner 2. Firma mit Privatnummer usw.... Sollte nun unser Telefon klingeln, und Hans Müller ruft von seinem Privattelefon an, wird's spannend :-) |
AW: Zeichen bei SELECT ignorieren
Namen sind nicht eindeutig, Telefonnummern schon (eher).
Ich sagt bereits, das dein Vorschlag als Notbehelft zu gebrauchen ist. Aber nur, wenn die Telefonnummern geeignet abgelegt ist. Und was ist morgen? Konkret: Dein Vorschlag wird umgesetzt und alle sind zufrieden, denn er funktioniert für die aktuelle Problemstellung: Suche nach vollständiger(!) Telefonummer über die derzeit gespeicherten Nummern (die z.B. nach E.123 abgelegt sind). Morgen werden jedoch die Outlook-Kontakte importiert und dort wird die Telefonnummer nach dem MS-Standard abgelegt, also +49(30)12345678 (in der DB sind sie jedoch im Format (030)12345678 abgelegt. Ja und dann ruft Hans Müller an, seine Nummer 03012345678 erscheint im Display und deine Suche findet -nichts-. Der Sachbearbeiter kann den Kunden nicht zuordnen und legt ihn im schlimmsten Fall neu an. Irgendwann wird dann vergessen, das die Lösung erstens nicht immer das korrekte Ergebnis anzeigt, zweitens nur taugt, wenn man die zu suchende Telefonnummer vollständig angibt und drittens doch nur mit einem bestimme Format funktioniert, also eben z.B. nur E.123, aber nicht mit anderen Standards. Und spätestens dann ist die Suche keine Suche sondern ein Glücksspiel. Deine Lösung zeigt also nicht nur zu viele an (was zu verschmerzen wäre), sondern ist leider unzuverlässig. Und damit imho so nicht zu gebrauchen. PS: Mein Beispiel funktioniert auch, wenn die Nummern nur im MS-Format abgelegt sind, also mit internationaler Vorwahl, jedoch ohne führende Null in der Ortsvorwahl. Denn es gibt generell mindestens vier unterschiedliche Formatgruppen, die hinsichtlich der einfache Suche disjunkt sind: Ortsvorwahl: (30) vs. (030). Landeskennzahl: +49 vs. 0049 vs. ganz weglassen. Wie Du siehst, wird es nie zuverlässig funktionieren, so elegant und kurz dein Vorschlag auch ist. Ein Suchalgorithmus muss robust gegen alle Kombinationen sein, d.h. er muss die gespeicherten und die Such-Telefonnummer in LKZ, OnKZ und Rufnummer unterteilen und dann vergleichen. Richtig richtig macht man es imho nur dann, wenn die Telefonnummern normalisiert abgelegt werden. Alles andere ist Murks. |
AW: Zeichen bei SELECT ignorieren
Ja, mit diesem einheitlichen Format habe ich mich lange und ausgiebig auseinandergesetzt. Sicherlich bin ich nicht die einzige, die solch eine Konstellation hat:
1. Firmeneigene Adressdatenbank 2. Exchange-Kontakte 3. Outlook auf PCs 4. SmartPhones mit verschiedenen Betriebssystemen Meine Adressdatenbank füllt die Exchange-Datenbank, die Exchange-Kontakte werden mit den Outlooks und den SmartPhones synchronisiert. Und nun die Sache mit dem Telefonnummern-Format. Microsoft war so frei sich ein eigenes Telefonnummern-Format zu erfinden, mit dem Exchange und Outlook problemlos arbeitet. Munter gibt man nun alle Telefonnummern in diesem MS-spezial-Format (siehe ![]() Aus diesem Grunde haben wir und dazu entschlossen dieses MS-Format nicht zu benutzen. |
AW: Zeichen bei SELECT ignorieren
MS ist soweit mir bekannt ein großer Sponsor von Wikipedia.
Was das bedeutet, kann sich jeder selber überlegen. |
AW: Zeichen bei SELECT ignorieren
Zitat:
|
AW: Zeichen bei SELECT ignorieren
Mmh, wenn das so da stand, wie es nun da steht, dann habt Ihr Euch ja mit MS scheinbar freiwillig gegen ein sinnvolles Format entschieden oder?
Ich habe den Link ehrlich gesagt nicht gelesen, bevor ich meinen Beitrag geschrieben habe. Auch wenn der Artikel offenbar recht ausgewogen ist, kann der Hinweis auf den großen Spender sicher nicht schaden. |
AW: Zeichen bei SELECT ignorieren
Ja genau, wir haben uns dazu entschieden, dass unsere Adressverwaltung mit allen Telefonnummernformaten klar kommt. So werden Telefonnummern aus der DB so an eine Telefonanlage übergeben, dass diese die Nummer wählen kann und eingehende Anrufe egal in welchem Format die Nummer in der DB liegt, in der DB gefunden und angezeigt werden kann.
|
AW: Zeichen bei SELECT ignorieren
Zitat:
|
AW: Zeichen bei SELECT ignorieren
Wir nutzen das MS-Format, da es dem "Ordnungssinn" des/der Datenerfassenden nahe kommt.
Insbesonders bei proportionalen Fonts ist die Darstellung von Leerzeichen so katastrophal, das man mit diesem Format gut bedient ist. Und vom einen in das andere Format zu wechseln ist ja relativ einfach (ok, die Durchwahl wird nicht abgetrennt, aber die muß man nur dann kennen wenn man von der einen Nummer auf die andere schließen will, da kan man auch gleich erfasssen) Zitat:
Gruß K-H |
AW: Zeichen bei SELECT ignorieren
Ja eine Trennung in Ländervorwahl, Ortsvorwahl, Rufnummer und Durchwahl wäre traumhaft, nur wie bekomme ich meine aktuellen Daten in dieses Format ohne das manuell pflegen zu müssen.
|
AW: Zeichen bei SELECT ignorieren
Zitat:
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 03:32 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