Announcement

Collapse
No announcement yet.

regex Funktion Oracle SQL

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

  • regex Funktion Oracle SQL

    Hallo!

    Ich habe in einer Tabelle die Spalt Filename. Dort sind Dateinamen wie z.B. "blablabla_XYZ_62505672_1341207323.xml" gespeichert. In diesem Beispiel benötige ich nur die Zahlen "62505672". Dazu hatte ich in der Powershell die Regex "[6]{1}[2|3]{1}[0-9]{6}" angewendet. Dort hat sie auch ganz gut Funktioniert. Nun wollte ich diese auch in der Datenbank direkt mit dem SQL-Query

    Code:
    select regexp_substr('[6]{1}[2|3]{1}[0-9]{6}',FILENAME) from tabelle
    where status = 'ERROR'
    and modify_date > TO_DATE ('2012-07-01', 'YYYY-MM-DD')
    and errortext like '%XYZ%'
    order by modify_date
    Jedoch kommt nur NULL zurück. Was mache ich falsch?

    Grüße

  • #2
    Die Reihenfolge der Parameter ist anders herum:
    Code:
    select regexp_substr('blablabla_XYZ_62505672_1341207323.xml','[6]{1}[2|3]{1}[0-9]{6}') regstr from dual;
    
    regstr
    ----------------------
    62505672

    Comment


    • #3
      OK das hat nun ganz gut geklappt aber das Problem ist leider etwas kompilierter geworden.

      Der Dateiname ist nun wie folgt "blablabla_XYZ_62505672_1341207323" Nun kann es leider auch sein, dass vorn eine 5 oder 4 steht usw., also nicht wie bisher angenommen 6 usw. Nun habe ich mir folgende Query ausgedacht

      Code:
      select regexp_substr(FILENAME,'_[0-9]{8}_') AS "FILENAME" 
      from tabelle where status = 'ERROR' 
      and
      errortext like '%XYZ%'
      and 
      modify_date > TO_DATE ('2012-01-01', 'YYYY-MM-DD')
      Es kommt dann etwa so etwas heraus: _62505672_ oder _54505672_ usw. Nun stören jedoch noch die Unterstriche. Diese wollte ich dann mit einer Weiteren select Anweisung heraus filtern. Diese sah dann insgesamt so aus:

      Code:
      select regexp_substr(FILENAME,'[0-9]{8}') 
      from  Tabelle
      WHERE FILENAME IN(
           select regexp_substr(FILENAME,'_[0-9]{8}_') AS "FILENAME" 
           from Tabelle 
           where status = 'ERROR' 
           and errortext like '%XYZ%' 
           and modify_date > TO_DATE ('2012-01-01', 'YYYY-MM-DD')
         );
      Nur wird hier kein Ergebnis geliefert.

      Gibt es da noch eine anderen Weg oder mach ich was grundlegend falsch?

      Danke und Gruß

      Comment


      • #4
        Wenn die Klammerung von Oracle berücksichtigt wird
        _([0-9]{8})_
        Christian

        Comment


        • #5
          So also?
          Code:
          select regexp_substr(FILENAME,'[0-9]{8}') from tabelle WHERE FILENAME IN(
          select regexp_substr(FILENAME,'_([0-9]{8})_') AS FILENAME  from tabelle  where status = 'ERROR' and errortext like '%xyz%' and modify_date > TO_DATE ('2012-01-01', 'YYYY-MM-DD'));
          Wenn ja, funktioniert es leider nicht.

          Grüße

          Comment


          • #6
            Hier wäre ggf. regexp_replace angebracht, wenn immer ein _ vor und hinter den 8 Ziffern steht, dann geht einfach:
            Code:
            select regexp_replace('blablabla_XYZ_62505672_1341207323','.*\_([0-9]{8})\_.*','\1') regstr from dual;
            
            regstr
            ----------------------
            62505672

            Comment

            Working...
            X