@Gary_W писа за проблемът с използването на този шаблон на регулярен израз за разделяне на низове, точно поради начина, по който третира празните тагове. (И е на мисия... )
Алтернативният подход в тази публикация работи и тук, с екраниран разделител:
with t (str) as (
select '1|CAT|DOG' from dual
union all select '3|HARRY|GOAT|STACK' from dual
union all select '6||LION|TIGER' from dual
)
select str, regexp_substr(str, '(.*?)(\||$)', 1, 2, null, 1) from t;
STR REGEXP_SUBSTR(STR,
------------------ ------------------
1|CAT|DOG CAT
3|HARRY|GOAT|STACK HARRY
6||LION|TIGER
По същия начин за третия елемент:
select str, regexp_substr(str, '(.*?)(\||$)', 1, 3, null, 1) from t;
STR REGEXP_SUBSTR(STR,
------------------ ------------------
1|CAT|DOG DOG
3|HARRY|GOAT|STACK GOAT
6||LION|TIGER LION
И четвъртото:
select str, regexp_substr(str, '(.*?)(\||$)', 1, 4, null, 1) from t;
STR REGEXP_SUBSTR(STR,
------------------ ------------------
1|CAT|DOG
3|HARRY|GOAT|STACK STACK
6||LION|TIGER TIGER