RegEx in MySql Statement funktioniert nicht

Werbung:
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
    103 KB · Aufrufe: 4
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.
 
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

  • sql_2.JPG
    sql_2.JPG
    69,3 KB · Aufrufe: 1
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()?
 
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

  • sql_3.JPG
    sql_3.JPG
    52,3 KB · Aufrufe: 3
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.
 
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.
 
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)
 
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?
 
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'

"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"?
 
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

  • sql_4.JPG
    sql_4.JPG
    56,8 KB · Aufrufe: 1
Werbung:
Doku gibt es den Befehl schon ab 10.0.5.

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.
 
Zurück
Oben