Ankündigung

Einklappen
Keine Ankündigung bisher.

Datensätze in MySQL umformatieren?

Einklappen

Neue Werbung 2019

Einklappen
X
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

  • Datensätze in MySQL umformatieren?

    Hallo zusammen,

    ich brauche gerade mal eure Hilfe!

    Ich habe eine Datenbank mit über 10.000 Datensätze.
    Ein Feld ist die Telefonnummer und wurde als String formatiert.
    Die dort gespeicherten Telefonnr. sehen bspw. so aus:
    +49 123-7894560
    0202-123456789
    (0)202-1231231

    Wie kann ich am schnellsten die Telefonnummern so umforma-
    tieren, dass folgende Zeichen entfernt werden: - + / ( )

    VG, David


  • #2
    Welchen Vorteil soll das bringen?
    Was machst du mit 49123456789 im Vergleich zu 0123456789?
    Nach Telefonnummern kannst du doch auch in einem String suchen mit Like.

    Kommentar


    • #3
      Zitat von protestix Beitrag anzeigen
      Was machst du mit 49123456789 im Vergleich zu 0123456789?
      Ja, das führt tatsächlich zu Problemen.

      Wie kann ich denn mit Like bspw. eine Nummer suchen, die so aufgebaut ist 0201 - 79 45 123 546
      Da sind jetzt z.B. mehrere Leerzeichen vorhanden, kann ich dann auch Like nutzen dazu?

      Kommentar


      • #4
        Fangen wir mal so an: Sag doch mal, was willst du eigentlich erreichen? Was ist der Sinn dieser "Übung"?
        The string "()()" is not palindrom but the String "())(" is.

        Debugging: Finde DEINE Fehler selbst! | Gegen Probleme beim E-Mail-Versand | Sicheres Passwort-Hashing | Includes niemals ohne __DIR__
        PHP.de Wissenssammlung | Kein Support per PN

        Kommentar


        • #5
          Also, ich möchte realisieren, dass man Rufnummer finden kann, ohne auf Leerzeichen und Sonderzeichen
          achten zu müssen. Ebenfalls soll es ausreichen, wenn ich nur die letzten x Zahlen der Rufnummer eingebe.
          Die eingegebene Rufnummer, nach dieser gesucht werden soll, befindet sich in einer PHP-Variable.

          Mit folgender Query suche ich dann die entsprechenden Datensätze:
          PHP-Code:
          SELECT idmobilnr FROM liste WHERE mobilnr LIKE '%$sMobil%' 
          Mein Problem ist nun, was ist, wenn ich bspw. die letzten 5 Zeichen eingebe,
          die Rufnummer aber bspw. nach jeden zwei Ziffern ein Leerzeichen hat, o.ä.?

          Kommentar


          • #6
            Zitat von Dsimon24 Beitrag anzeigen
            Wie kann ich denn mit Like bspw. eine Nummer suchen, die so aufgebaut ist 0201 - 79 45 123 546
            Da sind jetzt z.B. mehrere Leerzeichen vorhanden, kann ich dann auch Like nutzen dazu?
            Das geht natürlich nicht.
            Ich wollte dich auch nur zum Nachdenken anregen, weil wahlloses Updaten von Daten oft nicht die Probleme löst.

            Du kannst Telefonnummern durchaus als String abspeichern, aber du solltest dir überlegen welches Format du verwendest.
            Dann musst du natürlich dafür Sorge tragen, das zukünftige Rufnummern auch nur in diesem Format in die Spalte eingetragen werden.

            Wenn du dich beispielsweise dazu entschliessen solltest deine Rufnummern in dieser Variante zu hinterlegen
            +49-30-1234567

            Kannst du nach Ländercodes, Städteworwahl, Rufnummer, sortieren, ausgeben, oder gruppieren:

            Beispiele:
            - nur Datensätze anzeigen mit deutscher Rufnummer
            SELECT `id`, `rufnummer` FROM `table` WHERE SUBSTRING(`rufnummer`,2,2)='49';

            - nur Datensätze anzeigen mit Berliner Vorwahl:
            SELECT `id`, `rufnummer` FROM `table` WHERE SUBSTRING(`rufnummer`,5,2)='30';

            - Suche nach einer bestimmten rufnummer, Stadt ist egal:
            SELECT `id`, `rufnummer` FROM `table` WHERE rufnummer` LIKE '%1234567'


            . Suche nach einer Rufnumer mit bekannter Vorwahl:
            SELECT `id`, `rufnummer` FROM `table` WHERE rufnummer` LIKE '%-30-1234567'


            Bei diesem Besipiel wird nicht berücksichtigt dass auch Durchwahlen -123 oder -04 vorkommen können, diese speichere ich mit 0 am Ende und die Durchwahlen kommen in eine extra Tabelle, da man oftmals mehrere Durchwahlnummern zu einer Rufnummer haben kann.

            Du siehst, Vorüberlegung ist das A und O.
            Wenn du das erledigt hast, dann kannst du in mehreren Durchläufen deine Datenbankspalte mit update und replace auf das richtige Format bringen.


            Kommentar


            • #7
              Du könntest replace verwenden:

              Code:
              SELECT id, mobilnr FROM liste WHERE REPLACE(REPLACE(REPLACE(REPLACE(mobilnr, ' ', ''), '-', ''), '(', ''), ')', '') LIKE '%$sMobil%' 


              entfernt in der mobilnr alle leerzeich und - und ( usw... also bei: (0)2 02-12 31 25 würde er die Nummer finden wenn du nach 0202 suchst

              Kommentar


              • #8
                Code:
                REPLACE(REPLACE(REPLACE(REPLACE
                Oder Regex ..
                The string "()()" is not palindrom but the String "())(" is.

                Debugging: Finde DEINE Fehler selbst! | Gegen Probleme beim E-Mail-Versand | Sicheres Passwort-Hashing | Includes niemals ohne __DIR__
                PHP.de Wissenssammlung | Kein Support per PN

                Kommentar


                • #9
                  wäre bei sooo vielen replace wahrscheinlich sinnvoller
                  wobei es regexp heißt ^^
                  hmmm... regexp gibt ja nur 0 oder 1 zurück wie kann man damit dann prüfen, ob der eingegebene teil in der nummer enthalten ist?

                  Kommentar


                  • #10
                    Zitat von protestix Beitrag anzeigen
                    Wenn du dich beispielsweise dazu entschliessen solltest deine Rufnummern in dieser Variante zu hinterlegen
                    +49-30-1234567

                    Kannst du nach Ländercodes, Städteworwahl, Rufnummer, sortieren, ausgeben, oder gruppieren:

                    Beispiele:
                    - nur Datensätze anzeigen mit deutscher Rufnummer
                    SELECT `id`, `rufnummer` FROM `table` WHERE SUBSTRING(`rufnummer`,2,2)='49';

                    - nur Datensätze anzeigen mit Berliner Vorwahl:
                    SELECT `id`, `rufnummer` FROM `table` WHERE SUBSTRING(`rufnummer`,5,2)='30';

                    - Suche nach einer bestimmten rufnummer, Stadt ist egal:
                    SELECT `id`, `rufnummer` FROM `table` WHERE rufnummer` LIKE '%1234567'


                    . Suche nach einer Rufnumer mit bekannter Vorwahl:
                    SELECT `id`, `rufnummer` FROM `table` WHERE rufnummer` LIKE '%-30-1234567'


                    Bei diesem Besipiel wird nicht berücksichtigt dass auch Durchwahlen -123 oder -04 vorkommen können, diese speichere ich mit 0 am Ende und die Durchwahlen kommen in eine extra Tabelle, da man oftmals mehrere Durchwahlnummern zu einer Rufnummer haben kann.

                    Du siehst, Vorüberlegung ist das A und O.
                    Wenn du das erledigt hast, dann kannst du in mehreren Durchläufen deine Datenbankspalte mit update und replace auf das richtige Format bringen.

                    Hier würde ich dann glaub ich einfach einzelne Spalten draus machen und am besten auch in eine eigene Tabelle auslagern die man dann per Fremdschlüssel referenziert.
                    Da sind die Felder dann alle Integer die Suche ist einfacher und ziemlich sicher auch ein gutes Stück schneller.

                    Kommentar


                    • #11
                      Lose Stichworte:

                      10000 ist nicht viel.
                      Was brauchst Du? Ordnung? Geschwindigkeit? Beides?

                      Um Deine ursprüngliche Frage zu beantworten, Zeichen entfernen kannst Du mit Replace.
                      Ob es Dich weiterbringt, wurde bereits angezweifelt.

                      Wenn Du alle Zeichen wie gewollt entfernst, verlierst Du Information. Was ist Ländervorwahl, was Ortsvorwahl, Rufnummer, Durchwahl?

                      Hast Du diese Information verloren oder sie liegt gar nicht erst vor, kannst Du die Rufnummern nicht in verschiedene Spalten schreiben.

                      Ich behaupte mal nach deinem Eröffnungspost, Du hast sowieso nicht alle Informationen.
                      Was immer Du tust, wird also wohl nur eine Näherung.

                      Mit Hilfe von Länder und Ortsvorwahllisten lässt sich vieles ausbügeln, zumindest solange Du noch nichts an Infos entfernt hast.

                      Rückwärtssuche ist ein Thema für sich.

                      ".. where feldname like '%teilwert' ist nicht schnell.

                      Also:
                      Solange Du keine akzeptable Lösung hast und es nicht so schnell sein muss und es bei 10000+/- bleibt, kannst Du mit Hilfe einer Funktion (Stored Function) die gegebenen (unveränderten Rufnummern vereinheitlichen und auf Originalwert und dem Funktionsrückgabewert mit Like suchen. Nicht schnell aber praktikabel und ergiebig.
                      Dabei machst Du dann Erfahrungen, wie/was gut/schlecht funktioniert und baust was ordentliches.

                      Kommentar

                      Lädt...
                      X