我怀疑使用分隔符分割字符串。
首先基于分隔符选择拆分,分割的字符串应基于 - 分隔符
进行拆分我原来的字符串: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
如何获得预期的输出? (需要再次拆分 - 分隔符)
答案 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
无关。