0

我正在尝试从所有内容都在一列中的地址中提取状态,这是一个示例:

2901 MAIN ST,CORNING,NY,14830

我一直在试图弄清楚如何与substrandinstr一起使用,但我似乎无法掌握instr. 这是我到目前为止所拥有的:

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

我以为它会从第二个逗号开始,到第三个逗号结束,然后把我的所有东西都放在中间,但情况似乎并非如此。

任何帮助表示赞赏。

4

2 回答 2

4

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

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
于 2013-07-23T01:15:04.153 回答
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)
于 2013-07-22T19:40:48.310 回答