我试图从一个列中包含所有内容的地址中提取状态,这是一个例子:
2901 MAIN ST,CORNING,NY,14830
我一直试图弄清楚如何一起使用substr
和instr
,但我似乎无法抓住instr
。以下是我到目前为止的情况:
select substr('hello,hello,NY,11725-1234',1,instr('hello,hello,NY,11725-1234',',',2,3))
from dual;
我认为它会从第二个逗号开始,到第三个结束,并在两者之间得到我的一切,但似乎并非如此。
感谢任何帮助。
答案 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