dbTalk Databases Forums  

Regular expressions: splitting with REGEXP_SUBSTR and "null"

comp.databases.oracle.misc comp.databases.oracle.misc


Discuss Regular expressions: splitting with REGEXP_SUBSTR and "null" in the comp.databases.oracle.misc forum.



Reply
 
Thread Tools Display Modes
  #1  
Old   
citte
 
Posts: n/a

Default Regular expressions: splitting with REGEXP_SUBSTR and "null" - 02-28-2008 , 10:02 AM






Hi,
I have a problem, I found on internet a way to split strings separated
by pipe | (for example) with regexp, something like that:

SELECT REGEXP_SUBSTR('One|Two|Three|Four','[^|]+', 1, 3)
FROM dual;

which gives the result:
Three

the problem comes when I have one of the words separated by the pipe
is actually a Null, so the string becomes
'One|Two||Four|'

the query

SELECT REGEXP_SUBSTR('One|Two||Four','[^|]+', 1, 3)
FROM dual;

result in:
Four

I needed a Null (or empty string).
How is this possible?

Thank you in advance!

Reply With Quote
  #2  
Old   
Mark D Powell
 
Posts: n/a

Default Re: Regular expressions: splitting with REGEXP_SUBSTR and "null" - 02-29-2008 , 11:31 AM






On Feb 28, 11:02*am, citte <nicola.ame... (AT) gmail (DOT) com> wrote:
Quote:
Hi,
I have a problem, I found on internet a way to split strings separated
by pipe | (for example) with regexp, something like that:

SELECT REGEXP_SUBSTR('One|Two|Three|Four','[^|]+', 1, 3)
FROM dual;

which gives the result:
Three

the problem comes when I have one of the words separated by the pipe
is actually a Null, so the string becomes
'One|Two||Four|'

the query

SELECT REGEXP_SUBSTR('One|Two||Four','[^|]+', 1, 3)
FROM dual;

result in:
Four

I needed a Null (or empty string).
How is this possible?

Thank you in advance!
Will this help?

SQL> l
1 select regexp_substr(replace('one|two||four','||','|NULL| '),
2* '[^|]+',1,3) from dual
SQL> /

REGE
----
NULL

Also to return an actual NULL value
SQL> select regexp_substr(replace('one|two||four','||',''),
2 '[^|]+',1,3) from dual;

R
-


HTH -- Mark D Powell --


Reply With Quote
  #3  
Old   
Mark D Powell
 
Posts: n/a

Default Re: Regular expressions: splitting with REGEXP_SUBSTR and "null" - 02-29-2008 , 11:31 AM



On Feb 28, 11:02*am, citte <nicola.ame... (AT) gmail (DOT) com> wrote:
Quote:
Hi,
I have a problem, I found on internet a way to split strings separated
by pipe | (for example) with regexp, something like that:

SELECT REGEXP_SUBSTR('One|Two|Three|Four','[^|]+', 1, 3)
FROM dual;

which gives the result:
Three

the problem comes when I have one of the words separated by the pipe
is actually a Null, so the string becomes
'One|Two||Four|'

the query

SELECT REGEXP_SUBSTR('One|Two||Four','[^|]+', 1, 3)
FROM dual;

result in:
Four

I needed a Null (or empty string).
How is this possible?

Thank you in advance!
Will this help?

SQL> l
1 select regexp_substr(replace('one|two||four','||','|NULL| '),
2* '[^|]+',1,3) from dual
SQL> /

REGE
----
NULL

Also to return an actual NULL value
SQL> select regexp_substr(replace('one|two||four','||',''),
2 '[^|]+',1,3) from dual;

R
-


HTH -- Mark D Powell --


Reply With Quote
  #4  
Old   
Mark D Powell
 
Posts: n/a

Default Re: Regular expressions: splitting with REGEXP_SUBSTR and "null" - 02-29-2008 , 11:31 AM



On Feb 28, 11:02*am, citte <nicola.ame... (AT) gmail (DOT) com> wrote:
Quote:
Hi,
I have a problem, I found on internet a way to split strings separated
by pipe | (for example) with regexp, something like that:

SELECT REGEXP_SUBSTR('One|Two|Three|Four','[^|]+', 1, 3)
FROM dual;

which gives the result:
Three

the problem comes when I have one of the words separated by the pipe
is actually a Null, so the string becomes
'One|Two||Four|'

the query

SELECT REGEXP_SUBSTR('One|Two||Four','[^|]+', 1, 3)
FROM dual;

result in:
Four

I needed a Null (or empty string).
How is this possible?

Thank you in advance!
Will this help?

SQL> l
1 select regexp_substr(replace('one|two||four','||','|NULL| '),
2* '[^|]+',1,3) from dual
SQL> /

REGE
----
NULL

Also to return an actual NULL value
SQL> select regexp_substr(replace('one|two||four','||',''),
2 '[^|]+',1,3) from dual;

R
-


HTH -- Mark D Powell --


Reply With Quote
  #5  
Old   
Mark D Powell
 
Posts: n/a

Default Re: Regular expressions: splitting with REGEXP_SUBSTR and "null" - 02-29-2008 , 11:31 AM



On Feb 28, 11:02*am, citte <nicola.ame... (AT) gmail (DOT) com> wrote:
Quote:
Hi,
I have a problem, I found on internet a way to split strings separated
by pipe | (for example) with regexp, something like that:

SELECT REGEXP_SUBSTR('One|Two|Three|Four','[^|]+', 1, 3)
FROM dual;

which gives the result:
Three

the problem comes when I have one of the words separated by the pipe
is actually a Null, so the string becomes
'One|Two||Four|'

the query

SELECT REGEXP_SUBSTR('One|Two||Four','[^|]+', 1, 3)
FROM dual;

result in:
Four

I needed a Null (or empty string).
How is this possible?

Thank you in advance!
Will this help?

SQL> l
1 select regexp_substr(replace('one|two||four','||','|NULL| '),
2* '[^|]+',1,3) from dual
SQL> /

REGE
----
NULL

Also to return an actual NULL value
SQL> select regexp_substr(replace('one|two||four','||',''),
2 '[^|]+',1,3) from dual;

R
-


HTH -- Mark D Powell --


Reply With Quote
  #6  
Old   
Doug Miller
 
Posts: n/a

Default Re: Regular expressions: splitting with REGEXP_SUBSTR and "null" - 02-29-2008 , 12:11 PM



In article <248f35ac-1e8c-424a-80cd-1da3edc66966 (AT) e6g2000prf (DOT) googlegroups.com>, Mark D Powell <Mark.Powell (AT) eds (DOT) com> wrote:
Quote:
On Feb 28, 11:02=A0am, citte <nicola.ame... (AT) gmail (DOT) com> wrote:
Hi,
I have a problem, I found on internet a way to split strings separated
by pipe | (for example) with regexp, something like that:

SELECT REGEXP_SUBSTR('One|Two|Three|Four','[^|]+', 1, 3)
FROM dual;

which gives the result:
Three

the problem comes when I have one of the words separated by the pipe
is actually a Null, so the string becomes
'One|Two||Four|'

the query

SELECT REGEXP_SUBSTR('One|Two||Four','[^|]+', 1, 3)
FROM dual;

result in:
Four

I needed a Null (or empty string).
How is this possible?

Thank you in advance!

Will this help?

SQL> l
1 select regexp_substr(replace('one|two||four','||','|NULL| '),
2* '[^|]+',1,3) from dual
SQL> /

REGE
----
NULL
Doesn't work in a more general case, e.g. attempting to select the fourth
string from 'one|two|||five' -- the desired result is NULL, but this method
returns 'five'. Conversely, trying to retrieve the fifth string should return
'five' but instead returns NULL.
Quote:
Also to return an actual NULL value
SQL> select regexp_substr(replace('one|two||four','||',''),
2 '[^|]+',1,3) from dual;

R
-
Also doesn't work for more general cases:
- specifying the second substring should return 'two' but instead returns
'twofour'
- specifying the fourth substring should return 'four' but instead returns a
null string
- specifying the third substring in 'one|two||four|five' should return a null
string, but instead returns 'five'

In general, when seeking the i-th substring, if the omitted substring is in
the n-th position, this method is guaranteed to produce correct results only
when 0 < i < (n - 1), or when i = n AND there are at most n non-null
substrings. If there are multiple omitted substrings, correct results may also
be obtained for other values of i, but only by coincidence.


Reply With Quote
  #7  
Old   
Doug Miller
 
Posts: n/a

Default Re: Regular expressions: splitting with REGEXP_SUBSTR and "null" - 02-29-2008 , 12:11 PM



In article <248f35ac-1e8c-424a-80cd-1da3edc66966 (AT) e6g2000prf (DOT) googlegroups.com>, Mark D Powell <Mark.Powell (AT) eds (DOT) com> wrote:
Quote:
On Feb 28, 11:02=A0am, citte <nicola.ame... (AT) gmail (DOT) com> wrote:
Hi,
I have a problem, I found on internet a way to split strings separated
by pipe | (for example) with regexp, something like that:

SELECT REGEXP_SUBSTR('One|Two|Three|Four','[^|]+', 1, 3)
FROM dual;

which gives the result:
Three

the problem comes when I have one of the words separated by the pipe
is actually a Null, so the string becomes
'One|Two||Four|'

the query

SELECT REGEXP_SUBSTR('One|Two||Four','[^|]+', 1, 3)
FROM dual;

result in:
Four

I needed a Null (or empty string).
How is this possible?

Thank you in advance!

Will this help?

SQL> l
1 select regexp_substr(replace('one|two||four','||','|NULL| '),
2* '[^|]+',1,3) from dual
SQL> /

REGE
----
NULL
Doesn't work in a more general case, e.g. attempting to select the fourth
string from 'one|two|||five' -- the desired result is NULL, but this method
returns 'five'. Conversely, trying to retrieve the fifth string should return
'five' but instead returns NULL.
Quote:
Also to return an actual NULL value
SQL> select regexp_substr(replace('one|two||four','||',''),
2 '[^|]+',1,3) from dual;

R
-
Also doesn't work for more general cases:
- specifying the second substring should return 'two' but instead returns
'twofour'
- specifying the fourth substring should return 'four' but instead returns a
null string
- specifying the third substring in 'one|two||four|five' should return a null
string, but instead returns 'five'

In general, when seeking the i-th substring, if the omitted substring is in
the n-th position, this method is guaranteed to produce correct results only
when 0 < i < (n - 1), or when i = n AND there are at most n non-null
substrings. If there are multiple omitted substrings, correct results may also
be obtained for other values of i, but only by coincidence.


Reply With Quote
  #8  
Old   
Doug Miller
 
Posts: n/a

Default Re: Regular expressions: splitting with REGEXP_SUBSTR and "null" - 02-29-2008 , 12:11 PM



In article <248f35ac-1e8c-424a-80cd-1da3edc66966 (AT) e6g2000prf (DOT) googlegroups.com>, Mark D Powell <Mark.Powell (AT) eds (DOT) com> wrote:
Quote:
On Feb 28, 11:02=A0am, citte <nicola.ame... (AT) gmail (DOT) com> wrote:
Hi,
I have a problem, I found on internet a way to split strings separated
by pipe | (for example) with regexp, something like that:

SELECT REGEXP_SUBSTR('One|Two|Three|Four','[^|]+', 1, 3)
FROM dual;

which gives the result:
Three

the problem comes when I have one of the words separated by the pipe
is actually a Null, so the string becomes
'One|Two||Four|'

the query

SELECT REGEXP_SUBSTR('One|Two||Four','[^|]+', 1, 3)
FROM dual;

result in:
Four

I needed a Null (or empty string).
How is this possible?

Thank you in advance!

Will this help?

SQL> l
1 select regexp_substr(replace('one|two||four','||','|NULL| '),
2* '[^|]+',1,3) from dual
SQL> /

REGE
----
NULL
Doesn't work in a more general case, e.g. attempting to select the fourth
string from 'one|two|||five' -- the desired result is NULL, but this method
returns 'five'. Conversely, trying to retrieve the fifth string should return
'five' but instead returns NULL.
Quote:
Also to return an actual NULL value
SQL> select regexp_substr(replace('one|two||four','||',''),
2 '[^|]+',1,3) from dual;

R
-
Also doesn't work for more general cases:
- specifying the second substring should return 'two' but instead returns
'twofour'
- specifying the fourth substring should return 'four' but instead returns a
null string
- specifying the third substring in 'one|two||four|five' should return a null
string, but instead returns 'five'

In general, when seeking the i-th substring, if the omitted substring is in
the n-th position, this method is guaranteed to produce correct results only
when 0 < i < (n - 1), or when i = n AND there are at most n non-null
substrings. If there are multiple omitted substrings, correct results may also
be obtained for other values of i, but only by coincidence.


Reply With Quote
  #9  
Old   
Doug Miller
 
Posts: n/a

Default Re: Regular expressions: splitting with REGEXP_SUBSTR and "null" - 02-29-2008 , 12:11 PM



In article <248f35ac-1e8c-424a-80cd-1da3edc66966 (AT) e6g2000prf (DOT) googlegroups.com>, Mark D Powell <Mark.Powell (AT) eds (DOT) com> wrote:
Quote:
On Feb 28, 11:02=A0am, citte <nicola.ame... (AT) gmail (DOT) com> wrote:
Hi,
I have a problem, I found on internet a way to split strings separated
by pipe | (for example) with regexp, something like that:

SELECT REGEXP_SUBSTR('One|Two|Three|Four','[^|]+', 1, 3)
FROM dual;

which gives the result:
Three

the problem comes when I have one of the words separated by the pipe
is actually a Null, so the string becomes
'One|Two||Four|'

the query

SELECT REGEXP_SUBSTR('One|Two||Four','[^|]+', 1, 3)
FROM dual;

result in:
Four

I needed a Null (or empty string).
How is this possible?

Thank you in advance!

Will this help?

SQL> l
1 select regexp_substr(replace('one|two||four','||','|NULL| '),
2* '[^|]+',1,3) from dual
SQL> /

REGE
----
NULL
Doesn't work in a more general case, e.g. attempting to select the fourth
string from 'one|two|||five' -- the desired result is NULL, but this method
returns 'five'. Conversely, trying to retrieve the fifth string should return
'five' but instead returns NULL.
Quote:
Also to return an actual NULL value
SQL> select regexp_substr(replace('one|two||four','||',''),
2 '[^|]+',1,3) from dual;

R
-
Also doesn't work for more general cases:
- specifying the second substring should return 'two' but instead returns
'twofour'
- specifying the fourth substring should return 'four' but instead returns a
null string
- specifying the third substring in 'one|two||four|five' should return a null
string, but instead returns 'five'

In general, when seeking the i-th substring, if the omitted substring is in
the n-th position, this method is guaranteed to produce correct results only
when 0 < i < (n - 1), or when i = n AND there are at most n non-null
substrings. If there are multiple omitted substrings, correct results may also
be obtained for other values of i, but only by coincidence.


Reply With Quote
  #10  
Old   
Peter Nilsson
 
Posts: n/a

Default Re: Regular expressions: splitting with REGEXP_SUBSTR and "null" - 02-29-2008 , 11:37 PM



citte <nicola.ame... (AT) gmail (DOT) com> wrote:
Quote:
Hi,
I have a problem, I found on internet a way to split
strings separated by pipe | (for example) with regexp,
something like that:

SELECT REGEXP_SUBSTR('One|Two|Three|Four','[^|]+', 1, 3)
FROM dual;

which gives the result:
Three

the problem comes when I have one of the words separated
by the pipe is actually a Null, so the string becomes
'One|Two||Four|'

the query

SELECT REGEXP_SUBSTR('One|Two||Four','[^|]+', 1, 3)
FROM dual;

result in:
Four

I needed a Null (or empty string).
How is this possible?
Here are some (not necessarily pretty) ways, assuming n > 0...

select
x,
n,
substr(
'|' || x || '|',
instr('|' || x || '|', '|', 1, n) + 1,
instr('|' || x || '|', '|', 1, n + 1)
- instr('|' || x || '|', '|', 1, n) - 1),
regexp_replace(
'|' || x || '|',
'^([^\|]*\|){' || n || ',' || n || '}([^\|]*)|.*',
'\2' ),
regexp_substr(
regexp_substr(x || '|', '[^\|]*\|', 1, n),
'[^\|]*'),
regexp_substr(
'|' || x,
'[^\|]*',
instr('|' || x, '|', 1, n) + 1)
from
(select 'one|two||four|five' x from dual),
(select level n from dual connect by level <= 7)

--
Peter


Reply With Quote
Reply




Thread Tools
Display Modes

Posting Rules
You may not post new threads
You may not post replies
You may not post attachments
You may not edit your posts

vB code is On
Smilies are On
[IMG] code is On
HTML code is Off



Powered by vBulletin Version 3.5.3
Copyright ©2000 - 2012, Jelsoft Enterprises Ltd.