在连字符或短划线之间提取字符

时间:2017-07-16 18:03:23

标签: sql oracle regexp-substr

我需要在连字符之间提取字符,我尝试使用regexp_substr但是我遇到了一个问题,因为字符串不一致。

字符串可以是

111111-111103-ABCDEF--L00002

123456-111111-ABCDEF-000000-111111

111111-111103-ABCDEF-000002-
第一组是资金, 第二项活动, 第三个帐户, 第四个组织 和第五个位置

我可以将regexp_substr用于第二和第三个字符串的字符串,如下所示

select regexp_substr('123456-111111-ABCDEF-000000-111111','[^-]+',1,4) from dual;

select regexp_substr('123456-111111-ABCDEF-000000-','[^-]+',1,5) from dual;

并为正确的字段指定正确的值。

但是我遇到了字符串123456-111111-ABCDEF - 111111的问题,第四个字段应该被指定为null,但它会获取第5个值并将其分配给第4个。

select regexp_substr('123456-111111-ABCDEF--111111','[^-]+',1,4) from dual;

有没有办法照顾' - '只计算一个连字符?

谢谢!

1 个答案:

答案 0 :(得分:1)

这假设字符串中的每个段都由' - '分隔。 所以制作' - '你好了:

select replace(regexp_substr('123456-111111-ABCDEF--111111' ,'[^-]*(-|$)',1,1), '-', '' ) from dual;
select replace(regexp_substr('123456-111111-ABCDEF--111111' ,'[^-]*(-|$)',1,4), '-', '' ) from dual;
select replace(regexp_substr('123456-111111-ABCDEF--111111' ,'[^-]*(-|$)',1,5), '-', '' ) from dual;

请参阅http://sqlfiddle.com/#!4/5a13e/10

更新:更好的解决方案,无需添加假人' - '最后