2016-08-02 19 views
0

Ich habe den folgenden Ausdruck: 15-JUL-16,20-JUL-16,20-JUL-16,30-JUL-16 in einer meiner Spalten.Sql Orcle: Regexp_substr

Ich habe erfolgreich SUBSTR(REGEXP_SUBSTR(base.systemdate, '.+,'), 1, 9) verwendet, um 15-JUL-16 (Ausdruck bis zum ersten Komma) aus dem Ausdruck zu erhalten.

Aber ich zur Hölle kann nicht herausfinden, wie man 30-JUL-16 (der letzte Ausdruck nach dem letzten Komma) bekommen.

Gibt es eine Möglichkeit, REGEXP_SUBSTR zu verwenden, um das zu bekommen? Und da sind wir schon dabei.

Gibt es eine gute Möglichkeit, nur REGEXP_SUBSTR zu verwenden, um 15-JUL-16 ohne Komma zu erhalten? Weil ich den zweiten SUBSTR verwende, um das Komma loszuwerden, damit ich es mit dem Datenformat kompatibel machen kann.

+0

Speichern Sie Daten nicht als durch Komma getrennte Elemente, sondern weisen Sie einen Wert pro Spalte/Zeile auf. – jarlh

+1

Sie suchen nach einer durch Kommas getrennten Zeichenfolge. Diese Frage wurde schon oft gestellt und beantwortet - einfach googeln nach "Oracle split csv" oder so. – mathguy

+0

Vielen Dank für den Vorschlag, aber ich kann nicht kontrollieren, wie Daten in unserem Data Warehouse gespeichert werden. Ich arbeite nur mit dem, was ich bekomme. Aber um meine Frage zu wiederholen. Wie kann ich SUBSTR (REGEXP_SUBSTR (base.systemdate, '. +,'), 1, 9) um REGEXP_SUBSTR ohne den zusätzlichen SUBSTR nur zu verwenden, um das erste Datum vor dem ersten Komma ohne das Komma zu erhalten? –

Antwort

0

können Sie ein sehr ähnliches Konstrukt verwenden:

SELECT REGEXP_SUBSTR(base.systemdate, '[^,]+$') 

Oracle (und reguläre Ausdrücke im Allgemeinen) sind "gierig". Dies bedeutet, dass sie die längste Zeichenfolge verwenden. Wenn Sie die Elemente in der Liste kennen alle die gleiche Länge haben, können Sie nur verwenden:

SELECT SUBSTR(ase.systemdate, -9) 
+0

Vielen Dank :) Die Sache ist die Länge der Ausdruck variiert. Manchmal gibt es 2 Daten, manchmal 4, manchmal 6. Und ich bin immer an der ersten und letzten (ohne Komma) interessiert, damit ich in Zukunft mit Daten arbeiten kann. –

+0

Meintest du '[^,] +'? - Das + fehlt. – mathguy

+0

ja. Das + Ding hat gefehlt. :) Aber ansonsten funktioniert es. Und wie kann ich SUBSTR (REGEXP_SUBSTR (base.systemdate, '. +,'), 1, 9) um nur REGEXP_SUBSTR ohne den zusätzlichen SUBSTR zu verwenden, um das erste Datum vor dem ersten Komma ohne das Komma zu erhalten? –

0

Versuchen Sie, diese

select dates from 
    (
     SELECT dates,max(id) over (partition by null) lastrec,min(id) over (partition by null) firstrec,id FROM (
      with mine as(select '15-JUL-16,20-JUL-16,20-JUL-16,30-JUL-16' hello from dual) 
       select rownum id,regexp_substr(hello, '[^,]+', 1, level) dates from mine 
       connect by regexp_substr(hello, '[^,]+', 1, level) is not null) 
    ) 
    where id=firstrec or id=lastrec 

diese Abfrage geben Ihnen erste und letzte Datensatz aus durch Kommata getrennte Liste.