1. Willkommen im Forum für alle Datenbanken! Registriere Dich kostenlos und diskutiere über DBs wie Mysql, MariaDB, Oracle, Sql-Server, Postgres, Access uvm
    Information ausblenden

RegEx in MySql Statement funktioniert nicht

Dieses Thema im Forum "MySQL und MariaDB" wurde erstellt von Maris, 15 Oktober 2018.

  1. akretschmer

    akretschmer Datenbank-Guru

    Was ist mit dem Teil "Du machst jetzt mal ein Select mit deinem Regex da und schaust Dir an, was bei rauskommt." ?
     
  2. Maris

    Maris Aktiver Benutzer

    Es kommt schon die richtige orderID raus. Die Frage ist wie kann ich diese nutzen. Ich will gefilterte Nummer nun in eine andere Datenbankspalte schreiben.
     

    Anhänge:

    • sql.JPG
      sql.JPG
      Dateigröße:
      103 KB
      Aufrufe:
      3
  3. akretschmer

    akretschmer Datenbank-Guru

    noch einmal, ich tippe jetzt extra langsam: du sollst im select-Teil Deinen Regex-Ausdruck mit reintun, also select ..., regexp_replace(...) from ... und Dir ansehen, was da rauskommt. Du bringst eine Funktion im WHERE, die etwas liefert. Was fehlt, ist ein Vergleich mit etwas. So ein Vergleich liefert dann TRUE oder FALSE und dient der Entscheidung, ob dieser Datensatz selektiert werden soll oder nicht. Du schreibst einfach nur eine Funktion, die etwas liefert. Das ist kein Vergleich, das ist keine logische Aussage, ob der Datensatz genutzt werden soll oder nicht. Das ist also logisch gesehen Bullshit. Nur erkennt MySQL das nicht wegens Blödheit.

    Weiterhin stand am Anfang mal sowas in Deiner Spalte "internalcomment":

    magnalister-Verarbeitung (Amazon)Marketplace Bestellnummer: 306-3584295-9664328** BUSINESS ORDER **Purchase Order Number:

    Nun stehen da 'nur' Zahlen und Bindestriche. Das verwirrt.
     
  4. Maris

    Maris Aktiver Benutzer

    Jetzt bin ich bei dir. Da kommt wieder Text raus... Also dieser:

    magnalister-Verarbeitung (Amazon)Marketplace Bestellnummer: 306-3584295-9664328** BUSINESS ORDER **Purchase Order Number:

    internalcomment ist die Datenbankspalte in der der oben geschriebene Text steht.

    Im Anhang das Ergebnis der Abfrage.

    Heißt das der Regex funktioniert nicht?
     

    Anhänge:

  5. akretschmer

    akretschmer Datenbank-Guru

    Dein Regexp_replace funktioniert bei mir, es ersetzt das, was es findet:

    Code:
    test=*# select regexp_replace('magnalister-Verarbeitung (Amazon)Marketplace Bestellnummer: 306-3584295-9664328** BUSINESS ORDER **Purchase Order Number:','\w\d{2}-?\d{7}-?\d{7}','');
                                                 regexp_replace                                            
    --------------------------------------------------------------------------------------------------------
     magnalister-Verarbeitung (Amazon)Marketplace Bestellnummer: ** BUSINESS ORDER **Purchase Order Number:
    (1 row)
    
    Also, "306-3584295-9664328" ist da nun raus. Mir scheint aber, das ist nicht das, was Du suchst. Ich Denke, Du suchst das, was da matcht:

    Code:
    test=*# select unnest(regexp_matches('magnalister-Verarbeitung (Amazon)Marketplace Bestellnummer: 306-3584295-9664328** BUSINESS ORDER **Purchase Order Number:','\w\d{2}-?\d{7}-?\d{7}',''));
           unnest       
    ---------------------
     306-3584295-9664328
    (1 row)
    
    test=*#
    
    Ob das mit MySQL so trivial machbar ist, weiß ich nicht. Hat es denn ein regexp_matches()?
     
  6. Maris

    Maris Aktiver Benutzer

    Man könnte es auch umkehren, aber dann kommt keine saubere Zahl mehr raus. Der Regex ist nicht perfekt. Es verbleibt noch ein Bindestrich am Anfang.
     

    Anhänge:

  7. akretschmer

    akretschmer Datenbank-Guru

    so, was war eigentlich das Ziel der Übung? Irgendwo hattest Du ein INSERT ... SELECT ... mit derselben Tabelle. Möglicherweise suchst Du ein Update, kein Insert.
    Und falls das so ist: warum? Du hättest dann redundante Daten in Deiner Tabelle. Das will man nicht.
     
  8. Maris

    Maris Aktiver Benutzer

    Naja, ich habe diese Bestellnummer vermischt mit Text in einem Datenbankfeld, damit ich aber mit dieser Zahl weiterarbeiten kann muss der ganze Text weg, sodass dann nur noch die Zahl übrig bleibt. Diese Zahl möchte ich nun in eine Spalte schreiben. Redundant ist das schon ein wenig, aber anders geht es nicht. Es ist leider nicht möglich nur die Bestellnummer zu bekommen. Wäre das der Fall könnte ich mir das alles sparen.

    Also Ziel ist es nun das extrahierte Ergebnis in eine andere Datenbankspalte zu bringen die ich helper genannt habe.
     
  9. akretschmer

    akretschmer Datenbank-Guru

    Nun, an sich brauchst Du die neue Spalte nicht, weil deren Inhalt berechenbar ist. Eine bessere Alternative wäre hier z.B. ein VIEW.

    Anyway, Du suchst nun ein

    UPDATE tabelle SET neue_spalte = regexp_replace(hier dein Zeugs da eintragen)
     
  10. Maris

    Maris Aktiver Benutzer

    Danke akretschmar. Aber ich jetzt noch mal genau über die Sache nachgedacht. und ich war mit replace auf der völlig falschen Fährte. MariaDB gibt es ja auch noch die Funktion regexp_substr. Nur die findet nichts...

    SELECT ordernumber, regexp_substr(internalcomment, '\w\d{2}-?\d{7}-?\d{7}') AS Nummer
    FROM s_order
    WHERE transactionID = '' AND paymentID = '10'

    Bin ich wieder auf dem Holzweg?
     
  11. akretschmer

    akretschmer Datenbank-Guru

    "findet nichts" im Sinne "die Spalte Nummer bleibt leer" oder "findet nichts" im Sinne "die Where-Condition filtert alle Zeilen raus, 0 Rows im Ergebniss"?
     
  12. Maris

    Maris Aktiver Benutzer

    Die Abfrage findet in der Tat die Nummer nicht. Die Spalten bleiben leer. Eigentlich sollte regex_substr doch zu matches führen laut Doku. Aber es passiert nicht. Den Regex hatte ich getestet. Im Anhang das Ergebnis.

    Vielen Dank noch für deinen Einsatz und Geduld!
     

    Anhänge:

  13. akretschmer

    akretschmer Datenbank-Guru

    entweder es funktioniert halt nicht mit MySQL, oder Dein Feld internalcomment enthält keinen passenden String.
     
  14. Maris

    Maris Aktiver Benutzer

  15. akretschmer

    akretschmer Datenbank-Guru

    Nun, ja. MySQL prüft seit zig Versionen z.B. die Syntax von Check-Constraints, wendet diese aber nicht an. Oder anders formuliert: nur daß die Syntax akzeptiert wird heißt (bei MySQL und Derivaten) oft noch nicht, daß es auch funktioniert wie gedacht. Klingt lustig, ist es aber nicht.
     
Die Seite wird geladen...

Diese Seite empfehlen

  1. Diese Seite verwendet Cookies. Wenn du dich weiterhin auf dieser Seite aufhältst, akzeptierst du unseren Einsatz von Cookies.
    Information ausblenden