如何在Oracle 11g regexp_substr函数中使用两个分隔符拆分字符串

时间:2017-04-19 18:17:58

标签: regex oracle11gr2 regexp-substr

我怀疑使用分隔符分割字符串。

首先基于分隔符选择拆分,分割的字符串应基于 - 分隔符

进行拆分

我原来的字符串:UMC12I-1234,CSM3-123,VQ, 预期产出:

UMC12I
CSM3
VQ

每个值都是行值

我尝试了选项

WITH fab_sites AS (
  SELECT trim(regexp_substr('UMC12I-1234,CSM3-123,VQ,', '[^,]+', 1, LEVEL)) fab_site
  FROM dual
  CONNECT BY LEVEL <= regexp_count('UMC12I-1234,CSM3-123,VQ,', '[^,]+')+1
)
SELECT fab_site FROM   fab_sites WHERE fab_site IS NOT NULL

- 基于分隔符

分割

输出是:

UMC12I-1234
CSM3-123
VQ

如何获得预期的输出? (需要再次拆分 - 分隔符)

2 个答案:

答案 0 :(得分:1)

您可以使用-使用

regexp_substr之前提取“字词”
([^,-]+)(-[^,-]+)?

模式将匹配并捕获到组1中除,-之外的一个或多个字符,然后匹配-的可选序列和除,-以外的1个字符。

请参阅regex demo

使用此regex_substr行代替您使用上述正则表达式:

SELECT trim(regexp_substr('UMC12I-1234,CSM3-123,VQ,', '([^,-]+)(-[^,-]+)?', 1, LEVEL, NULL, 1)) fab_site

请参阅online demo

答案 1 :(得分:1)

您可以尝试此查询:

WITH fab_sites AS (
      SELECT TRIM(',' FROM REGEXP_SUBSTR('UMC12I-1234,CSM3-123,VQ,', '(^|,)[^,-]+', 1, LEVEL)) fab_site
        FROM dual
     CONNECT BY LEVEL <= REGEXP_COUNT('UMC12I-1234,CSM3-123,VQ,', '(^|,)[^,-]+')
)
SELECT fab_site
  FROM fab_sites;

我们首先匹配任何以整个字符串^的开头或逗号,(分隔符)开头的子字符串。然后,我们得到的所有字符既不匹配逗号也不匹配-。一旦我们有了子字符串,我们就会删除它中剩下的任何逗号。

P.S。我认为+1子句中的CONNECT BY与“外部”查询中的WHERE NOT NULL无关。