2016-08-01 8 views
0

Ich habe eine Zeichenfolge wie folgt: ABCAPP9 Xore-Done-1. Ich möchte die Zeichenfolge zerkleinern, um 4 Elemente zu einem bestimmten Zeitpunkt getrennt in pl sql zu erhalten. Bitte sagen Sie mir die 4 verschiedenen Abfragen, um die folgenden 4 Ergebnisse separat zu erhalten. DankWie man einen String in pl sql mit regexp chunk?

  1. ABCAPP9
  2. Xore
  3. Geschehen

Antwort

0
REGEXP_SUBSTR ('ABCAPP9 Xore-Done-1', '[^[:space:]-]+', 1, n) 

werden Sie den n-ten Teil geben. Ändere n mit der gewünschten Nummer. Hier sind alle:

SELECT REGEXP_SUBSTR ('ABCAPP9 Xore-Done-1', '[^[:space:]-]+', 1, LEVEL) 
     FROM DUAL 
CONNECT BY REGEXP_SUBSTR ('ABCAPP9 Xore-Done-1', '[^[:space:]-]+', 1, LEVEL) IS NOT NULL 
+0

Ich frage mich, warum dies nicht für mich funktioniert. Aber ich könnte das Ergebnis erhalten, indem ich diesen Beitrag wie folgt modifiziere. wähle regexp_substr ('ABCAPP9 Xore-Done-1', '[^ \ s | -] +', 1, n) aus dual; – user2153047

0

Dies ist ein Kommentar wirklich @Mottor sein sollte, aber da keine Formatierung in den Kommentaren Ich brauche es hier zu machen.

Ein Wort der Warnung. Solange alle Elemente Ihrer Zeichenfolge vorhanden sind und die Trennzeichen NIEMALS nebeneinander liegen können, ist alles in Ordnung. Das Regex-Format '[^<delimiter>]+', das normalerweise zum Analysieren von Zeichenfolgen verwendet wird, gibt jedoch nicht den richtigen Wert zurück, wenn ein NULL-Element in der Liste vorhanden ist! Siehe diesen Beitrag zum Beweis: https://stackoverflow.com/a/31464699/2543416. Um in Ihrem Beispiel zu testen, den Teil „Xore“ entfernen, den Raum und den Bindestrich verläßt nebeneinander:

SQL> SELECT REGEXP_SUBSTR ('ABCAPP9 -Done-1', '[^[:space:]-]+', 1, LEVEL) 
     FROM DUAL 
    CONNECT BY REGEXP_SUBSTR ('ABCAPP9 -Done-1', '[^[:space:]-]+', 1, LEVEL) IS NOT NULL; 

REGEXP_SUBSTR(' 
--------------- 
ABCAPP9 
Done 
1 

Das zweite Element NULL sein sollte, aber „done“ wird zurückgegeben, statt! Nicht gut, wenn die Position wichtig ist.

Verwenden Sie dieses Format anstelle NULLs zu handhaben und (wieder hier mit „Xore“ entfernt und somit ein NULL in dieser Position die NULL zu beweisen, dass es Griffe) das richtige Zeichenfolge Element in der richtigen Position zurück:

SQL> with tbl(str) as (
    select 'ABCAPP9 -Done-1' from dual 
    ) 
    select regexp_substr(str, '(.*?)(|-|$)', 1, level, NULL, 1) 
    from tbl 
    connect by regexp_substr(str, '(.*?)(|-|$)', 1, level) is not null; 

REGEXP_SUBSTR(S 
--------------- 
ABCAPP9 

Done 
1 

SQL> 

Ich schaudere, um an all die schlechten Daten zu denken, die dort zurückgegeben werden.

So user2153047, wenn Sie noch mit mir, für Ihre Bedürfnisse sind, wenn Sie das dritte Element (und behandeln die NULL) Sie verwenden würde:

SQL> select regexp_substr('ABCAPP9 -Done-1', '(.*?)(|-|$)', 1, 3, NULL, 1) "3rd" 
     from dual; 

3rd 
---- 
Done