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