Announcement

Collapse
No announcement yet.

E-Mail ohne TLD vergleichen (de/ com)

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • E-Mail ohne TLD vergleichen (de/ com)

    Hallo Community,

    ich bräuchte mal etwas Hilfe. Würde gerne E-Mail Adressen aus zwei verschiedenen Tabellen ohne TLD vergleichen, d.h., [email protected] soll das gleiche wie [email protected] sein. Wenn die E-Mail Adressen, bis auf die TLD, übereinstimmen sollen sie nicht ausgegeben werden.
    Es müsste wahrscheinlich so ähnlich aussehen, wie:
    Code:
    select ... where substr('a.email', 1, instr('a.email', '.') -1) != substr('b.email', 1, instr('b.email', '.') -1)...
    Vielleicht auch nicht. Erst einmal sollen nur .com und .de berücksichtigt werden. Falls es eine Allround-Lösung für alle TLD's gibt...

  • #2
    Hallo, ronjambo,

    wenn ich dich richtig verstehe und du alles die Mails willst, die in der anderen Tabelle nicht vorhanden sind, dann vielleicht so:

    Code:
    select ... where substr('a.email', 1, instr('a.email', '.') -1) not in (select substr('b.email', 1, instr('b.email', '.') -1) from ...)
    hth

    Ralf

    Comment


    • #3
      Um die Emails zu filtern bietet sich regexp_replace an:
      Im anhängenden Beispiel werden die beiden Teststrings gefiltert:
      \1 ist 1. Teil der Email bis zum (ersten Punkt)
      \2 ist letzter Teil der Email bestehend aus beliebigen Buchstaben bis zum Ende (TLD)
      Die gesamte Email wird durch den Teil \1 ersetzt, im (nicht verwendeten) Teil \2 findet sich die TLD.
      Code:
      WITH emails AS
           (SELECT '[email protected]' ead  FROM DUAL
            UNION ALL
            SELECT '[email protected]'    FROM DUAL)
      SELECT emails.*,  regexp_replace(emails.ead, '(.*)\.([[:alpha:]]*$)', '\1')
        FROM emails,
      Damit wird der Vergleich/die Weiterverarbeitung recht einfach.
      Die Dokumentation findet sich hier: http://download.oracle.com/docs/cd/B...0.htm#i1305521

      Viel Erfolg!

      Comment


      • #4
        Hallo, jum,

        Originally posted by jum View Post
        \1 ist 1. Teil der Email bis zum (ersten Punkt)
        \1 reicht bis zum letzten Punkt, weil reguläre Ausdrücke von Haus aus gierig sind. Ist ja aber gut so, sonst würde das ja bei [email protected] nicht klappen.

        Originally posted by jum View Post
        Code:
        SELECT emails.*,  regexp_replace(emails.ead, '(.*)\.([[:alpha:]]*$)', '\1')
        ein '(.*)\.(.*)' würde wohl das Gleiche mit etwas weniger Arbeit tun - oder?

        Gruß

        Ralf

        Comment


        • #5
          @ralf, das ist natürlich korrekt, durch den greedy-Operator wird \1 bis vor den letzten Punkt gematcht- Danke! Für die Realisierung gibt es je nach "integrierten" Prüfungen viele Möglichkeiten, von denen Dein Vorschlag noch etwas kürzer ist .

          Comment


          • #6
            @jum, prinzipiell denke ich aber - bei aller von mir geteilten Begeisterung für reguläre Ausdrücke -, dass die schon von ronjambo gewählte substr-instr-Kombination hier das schnellste Ergebnis liefert.

            Gruß und schönen Feiertag

            Ralf

            Comment


            • #7
              Meine substr-instr-Kombi haut leider nicht ganz hin, da sie nur bis zum ersten Punkt geht, aber mit regexp_replace komme ich zum gewünschten Ergebnis.

              Danke!

              Comment


              • #8
                Originally posted by ronjambo View Post
                Meine substr-instr-Kombi haut leider nicht ganz hin, da sie nur bis zum ersten Punkt geht.
                Wieso?
                Code:
                > WITH emails AS
                  2       (SELECT '[email protected]' ead  FROM DUAL
                  3        UNION ALL
                  4        SELECT '[email protected]'    FROM DUAL)
                  5  SELECT emails.*,  substr(emails.ead, 1,INSTR(emails.ead,'.',-1))
                  6    FROM emails;
                
                EAD             SUBSTR(EMAILS.E
                [email protected]  f.oo@foobar.
                [email protected] f.oo@foobar.
                Gruß

                Ralf

                Comment


                • #9
                  Weil ich die Klammer falsch gesetzt habe.

                  vorher:
                  Code:
                  substr(email, 1, instr(email, '.')-1)
                  nachher:
                  Code:
                  substr(email, 1, instr(email, '.', -1))
                  Danke für den Hinweis!

                  Comment

                  Working...
                  X