获得第二个和第三个逗号之间的值

时间:2013-07-22 19:27:41

标签: sql oracle substr

我试图从一个列中包含所有内容的地址中提取状态,这是一个例子:

2901 MAIN ST,CORNING,NY,14830

我一直试图弄清楚如何一起使用substrinstr,但我似乎无法抓住instr。以下是我到目前为止的情况:

select substr('hello,hello,NY,11725-1234',1,instr('hello,hello,NY,11725-1234',',',2,3))
from dual;

我认为它会从第二个逗号开始,到第三个结束,并在两者之间得到我的一切,但似乎并非如此。

感谢任何帮助。

2 个答案:

答案 0 :(得分:4)

select 
  regexp_substr('2901 MAIN ST,CORNING,NY,14830', '(.*?,){2}(.*?),', 1, 1, '', 2) 
from dual

一般来说,

n_th_component := 
  regexp_substr(string, '(.*?,){'||(n-1)||'}([^,]*)', 1, 1, '', 2);

示例:

select 
  n,  
  regexp_substr('2901 MAIN ST,CORNING,NY,14830', 
                '(.*?,){'||(n-1)||'}([^,]*)', 1, 1, '', 2)
from (select level n from dual connect by level <= 4)

答案 1 :(得分:4)

正则表达式是做这种事情的好方法。但是,也可以通过利用INSTR的第4个参数nth_appearance来使用SUBSTR和INSTR:

select INSTR(mystring,',',1,1) AS first_comma
      ,INSTR(mystring,',',1,2) AS second_comma
      ,SUBSTR(mystring
             ,INSTR(mystring,',',1,1) + 1
             ,INSTR(mystring,',',1,2)
              - INSTR(mystring,',',1,1)
              - 1)
       AS middle_bit
FROM
(select 'hello,world,NY,11725-1234' as mystring from dual);

FIRST_COMMA  SECOND_COMMA  MIDDLE_BIT
===========  ============  ==========
          6            12  world