2017-04-19 251 views
3

我怀疑要使用分隔符分割字符串。如何在Oracle 11g中使用两个分隔符分割字符串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 

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

回答

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

+0

可能您的第二个链接存在问题:**在线演示** –

+0

@ k-five:在蜗牛笔记本电脑上打字通常会导致出现此类“拼写错误”。它应该是http://rextester.com/QBE60576。 –

+0

Hi Wiktor,它的工作,非常感谢你 – Chidam

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.我认为CONNECT BY子句中的+1是无关紧要的,而“外部”查询中的WHERE NOT NULL也是如此。

+0

嗨大卫,它的工作,非常感谢 – Chidam

相关问题