Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/81.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 提取连字符或破折号之间的字符_Sql_Oracle_Regexp Substr - Fatal编程技术网

Sql 提取连字符或破折号之间的字符

Sql 提取连字符或破折号之间的字符,sql,oracle,regexp-substr,Sql,Oracle,Regexp Substr,我需要提取连字符之间的字符,我尝试使用regexp_substr,但我遇到了一个问题,因为字符串不一致 字符串可以是 111111-111103-ABCDEF--L00002 123456-111111-ABCDEF-000000-111111 111111-111103-ABCDEF-000002- 第一套是资金,, 第二项活动, 第三帐户, 第四组织 和第五个位置 我可以使用regexp_substr作为第二个和第三个字符串的字符串,如下所示 select 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,但是它会选择第五个值并赋值给第四个

select regexp_substr('123456-111111-ABCDEF--111111','[^-]+',1,4) from dual;
有没有办法处理'-'并只计算一个连字符


谢谢

这假定字符串中的每个段都由“-”分隔。 因此,让“乌尔阿乔”成为:

从dual中选择replace(regexp_substr('123456-111111-ABCDEF--111111','[^-]*(-124;$),1,1),'-','';
从dual中选择replace(regexp_substr('123456-111111-ABCDEF--111111','[^-]*(-124;$)',1,4),'-','';
从dual中选择replace(regexp_substr('123456-111111-ABCDEF--111111','[^-]*(-124;$)',1,5),'-','';


更新:更好的解决方案,不需要在末尾添加一个伪“-”

非常感谢!我错过了那个解决方案。然而,这个解决方案对|很有效,当我用-,替换|时,它会给我一个空白,但是我修改了我的字符串以使其工作。非常感谢你重新引导我!!如果字符串包含空元素,则用于解析分隔字符串的格式为“
”[^-]+'
的正则表达式将失败,应避免使用。有关更多信息,请参阅本文:。i、 e.对于位置:
从dual中选择regexp_substr('123456-111111-ABCDEF--11111 2','(.*?(-|$)',1,5,NULL,1)位置。太糟糕了,问题结束了。非常感谢!请检查我的答案是否正确