问题
I need to split message:
500 Oracle Parkway.Redwood Shores.*.=13
Now I have a bit worked solution for Substr1/2/4
SELECT '500 Oracle Parkway.Redwood Shores.*.=13' string1,
REGEXP_SUBSTR('500 Oracle Parkway.Redwood Shores.*.=13','.[^.]+')
"SUBSTR1" ,
replace(REGEXP_SUBSTR('500 Oracle Parkway.Redwood Shores.*.=13','[$.]+
[^.]+'),'.',null) "SUBSTR2" ,
REGEXP_SUBSTR('500 Oracle Parkway.Redwood Shores.*.=13','[$.]+.[$.]+[^.]')
"SUBSTR3" ,
REGEXP_SUBSTR('500 Oracle Parkway.Redwood Shores.*.=13','[^=]+$')
"SUBSTR4"
FROM DUAL;
However Substr3 contains '='. I'd like to have at least '.*.' or ' * '
Could you please give me a hint how to "exclude" any characters (e.g. '=') in regexp?
Any help is much appreciated!
Thank you
Resolved see SUBSTR3.1
SELECT
'500 Oracle Parkway.Redwood Shores.*.=13' string1,
REGEXP_SUBSTR('500 Oracle Parkway.Redwood Shores.*.=13','.[^.]+')
"SUBSTR1" ,
replace(REGEXP_SUBSTR('500 Oracle Parkway.Redwood Shores.*.=13','[$.]+
[^.]+'),'.',null) "SUBSTR2" ,
REGEXP_SUBSTR('500 Oracle Parkway.Redwood Shores.*.=13','[$.]+.[$.]+
[^.]') "SUBSTR3" ,
REGEXP_SUBSTR('500 Oracle Parkway.Redwood Shores.*.=13','[^.]+',1,3)
"SUBSTR3.1" ,
REGEXP_SUBSTR('500 Oracle Parkway.Redwood Shores.*.=13','[^=]+$')
"SUBSTR4"
FROM DUAL;
回答1:
With much respect to Alex Poole, the regex of the format '[^.]+'
fails if one of the elements of the list is missing. It will silently return incorrent data. Please use this form instead. Note I removed the city from the first example. Try it and you may be surprised:
with t (str) as (
select '500 Oracle Parkway..*.=13' from dual union
select 'One Microsoft Way.Redmond.Washington.=27' from dual
)
select str,
regexp_substr(str, '(.*?)(\.|$)', 1, 1, NULL, 1) as substr1,
regexp_substr(str, '(.*?)(\.|$)', 1, 2, NULL, 1) as substr2,
regexp_substr(str, '(.*?)(\.|$)', 1, 3, NULL, 1) as substr3,
ltrim(regexp_substr(str, '(.*?)(\.|$)', 1, 4, NULL, 1), '=') as substr4
from t;
See here for more info: Split comma separated values to columns in Oracle
回答2:
It looks like you're trying to tokenize your source string based on periods, and them (maybe) remove the leading equals sign from the fourth token. The solution you've used for your 'substring3.1' can be used for all of them:
with t (str) as (
select '500 Oracle Parkway.Redwood Shores.*.=13' from dual
union all select 'One Microsoft Way.Redmond.Washington.=27' from dual
)
select str,
regexp_substr(str, '[^.]+', 1, 1) as substr1,
regexp_substr(str, '[^.]+', 1, 2) as substr2,
regexp_substr(str, '[^.]+', 1, 3) as substr3,
ltrim(regexp_substr(str, '[^.]+', 1, 4), '=') as substr4
from t;
STR SUBSTR1 SUBSTR2 SUBSTR3 SUBSTR4
---------------------------------------- -------------------- -------------------- ---------- -------
500 Oracle Parkway.Redwood Shores.*.=13 500 Oracle Parkway Redwood Shores * 13
One Microsoft Way.Redmond.Washington.=27 One Microsoft Way Redmond Washington 27
来源:https://stackoverflow.com/questions/43888870/oracle-split-message-with-regexp-substr