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. Maris

    Maris Aktiver Benutzer

    Hallo zusammen,

    ich brauche eine Hilfestellung:

    Dieses Statement liefert immer 0 Ergebnisse zurück. Kann mir jemand sagen warum?

    SELECT transactionID, internalcomment, ordernumber FROM s_order
    WHERE transactionID = '' AND paymentID = '10'
    AND internalcomment REGEXP '\w\d{2}-?\d{7}-?\d{7}'

    Im internalcomment steht sowas drin:

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

    Mit einem Regextester habe ich auch schon die Bestellnummer erfolgreich extrahieren können: 306-3584295-9664328

    Nur nach dem Ausführen des Statements kommt immer kein Ergebnis.

    Viele Grüße
    Christian
     
  2. Maris

    Maris Aktiver Benutzer

    Ok. Ich habe es mit UPDATE und einer Helfer Spalte versucht. Klappt nicht:

    UPDATE `s_order`
    SET `helper` = Replace(`internalcomment`,'','\w\d{2}-?\d{7}-?\d{7}')
    WHERE `ordernumber` = '51598' AND `internalcomment` REGEXP '\w\d{2}-?\d{7}-?\d{7}'

    Jemand eine Idee wir ich die Bestellnummer in die Helper Spalte bekomme?
     
  3. Maris

    Maris Aktiver Benutzer

    Habs auch mit einem Substring versucht... SQL beachtet den REgEx nicht. Bin Anfänger. Hilfe wäre nicht schlecht :-/

    SELECT internalcomment, SUBSTRING_INDEX(`internalcomment`, '\w\d{2}-?\d{7}-?\d{7}', 1) AS Bestellnummer
    FROM s_order
    WHERE `ordernumber`='51598'
     
  4. akretschmer

    akretschmer Datenbank-Guru

    Du wirst im WHERE das vergleichen müssen. Schnellschuß:

    Code:
    test=*# select 'magnalister-Verarbeitung (Amazon)Marketplace Bestellnummer: 306-3584295-9664328** BUSINESS ORDER **Purchase Order Number:' ~ '\w\d{2}-?\d{7}-?\d{7}';
     ?column?
    ----------
     t
    (1 row)
    
    
    das liefert also TRUE und könnte so im WHERE verwendet werden (der Text aus der Spalte natürlich).


    Andreas
     
  5. Maris

    Maris Aktiver Benutzer

    Ich habe jetzt auf MariaDB gewechselt aber ich bekomme es nicht hin die Ordernummer die ich per Regex extrahiere in eine ander Spalte zu importieren. Bin am verzweifeln und über jeden Tipp dankbar.
     
  6. akretschmer

    akretschmer Datenbank-Guru

    ach so, du willst quasi diese Nummer da ausschneiden?

    Code:
    test=*# select regexp_matches('magnalister-Verarbeitung (Amazon)Marketplace Bestellnummer: 306-3584295-9664328** BUSINESS ORDER **Purchase Order Number:','\w\d{2}-?\d{7}-?\d{7}','');
        regexp_matches     
    -----------------------
     {306-3584295-9664328}
    (1 row)
    
    PostgreSQL. Die Klammern da bekommt man sicher auch noch weg ...
     
  7. Maris

    Maris Aktiver Benutzer

    Ja. Ich habe das versucht: Aber das klappt nicht:

    INSERT INTO s_order(textval,helper)

    SELECT internalcomment AS textval,REGEXP_REPLACE (internalcomment,'\w\d{2}-?\d{7}-?\d{7}', '') AS helper
    FROM s_order

    Möglicherweise ist das Statement einfach falsch. Ich bin nicht so fit. Aber das sollte doch möglich sein, die Nummer in die Spalte helper geschrieben zu bekommen.
     
  8. akretschmer

    akretschmer Datenbank-Guru

    regexp_replace ersetzt den Text, bei Dir durch ''. Den Treffer, 'matches', bekommst Du damit nicht. Die Frage, ob MySQL oder Inkarnationen davon das können, matcht grade bei mir nicht ...
     
  9. Maris

    Maris Aktiver Benutzer

    Hi, ich habe jetzt schon mal ein funktionierendes Statement gebastelt:

    UPDATE s_order
    SET helper = regexp_replace(internalcomment, '\w\d{2}-?\d{7}-?\d{7}', '')
    WHERE ordernumber = '50157'

    MariaDB in der Version 10.2 sollte das eigentlich können. Mit diesem Statement wird allerdings der gesamte Text aus internalcomment kopiert. Statt nur der Auszug. Irgendwas mache ich falsch. Schade das so wenig Leute mir einen Tipp geben. Vielleicht sollte ich mir ein anderes Forum suchen.

    Grüße
    Christian
     
  10. akretschmer

    akretschmer Datenbank-Guru

    Nein, dein Regex wird aus diesem rausgeschnitten. Die Lösung nannte ich aber schon.
     
  11. Maris

    Maris Aktiver Benutzer

    Dieses Statement funktioniert und liefert nur die Nummer.

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

    Jetzt müßte ich das Ergebnis nur in die Spalte helper geschrieben werden. Das funktioniert mit:

    UPDATE s_order
    SET helper = regexp_replace(internalcomment, '\w\d{2}-?\d{7}-?\d{7}', '')

    leider nicht.

    Ist das Statement für die UPDATE Funktion falsch?
     
  12. akretschmer

    akretschmer Datenbank-Guru

    in Deinem Select liefert das regexp_replace irgend etwas, was MySQL dann wohl als logisch WAHR interpretiert. An sich ist es so wie es dasteht Bullshit, in PG würde es einen Fehler geben:

    Code:
    test=*# create table foo(t  text);
    CREATE TABLE
    test=*# insert into foo values ('test');
    INSERT 0 1
    test=*# select regexp_replace(t, 'es','') from foo;
     regexp_replace
    ----------------
     tt
    (1 row)
    
    test=*# select * from foo where regexp_replace(t, 'es','');
    FEHLER:  Argument von WHERE muss Typ boolean haben, nicht Typ text
    LINE 1: select * from foo where regexp_replace(t, 'es','');
                                    ^
    test=*#
    
    Wir sehen mal wieder: MySQL ist doof.

    Du machst jetzt mal ein Select mit deinem Regex da und schaust Dir an, was bei rauskommt.
     
  13. Maris

    Maris Aktiver Benutzer

    Sorry akretschmer! Deine Antwort hilft mir nicht weiter.
     
  14. akretschmer

    akretschmer Datenbank-Guru

    welchen Teil verstehst Du denn nicht?
     
  15. Maris

    Maris Aktiver Benutzer

    ich kenne mich mit PostgreSQL nicht aus. Für mich ist das alles nur Bahnhof. Vorallem was muss ich mit sql anders machen. Ich verstehe es einfach 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