3

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

首先拆分基于,分隔符选择那些拆分的字符串应该基于-delimiter拆分

我的原始字符串: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

我怎样才能得到我的预期输出?(需要再次拆分 - 分隔符)

4

2 回答 2

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;

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

PS我认为子句中的+1inCONNECT BY是无关紧要的,WHERE NOT NULL“外部”查询中的也是。

于 2017-04-19T19:39:44.303 回答
1

-您可以使用regexp_substrusing提取之前的“单词”

([^,-]+)(-[^,-]+)?

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

请参阅正则表达式演示

在上面的正则表达式中使用这一regex_substr行而不是你的行:

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

查看在线演示

于 2017-04-19T18:34:38.547 回答