Oracle正则表达式拆分,但可以解决方格
我有一个字符串,例如:“ att1:val1,[txt1,txt2:txt3]:val2“
使用Oracle SQL,我想将一行分为一行&列如下:
lvl | substr2 | substr3 |
---|---|---|
1 | att1 | val1 |
2 | [txt1,txt2:txt3] | val2 |
我尝试了以下代码,但是不知道如何不被逗号分开和括号之间的括号之间的值
with WTBL as
(
select 'Att1:Val1,[Txt1,Txt2:Txt3]:Val2,' as WCLN
from dual
)
select lvl, substr1, substr2, substr3, WCLN
from WTBL
cross join xmltable('if (contains($PRM,","))
then
let $list := ora:tokenize($PRM, ","),
$cnt := count($list)
for $val at $r in $list
where $r < $cnt
return $val
else $PRM'
passing WCLN as PRM
columns substr1 varchar2(4000) path '.'
,substr2 varchar2(4000) path 'if (contains( . , ":")) then
let $list := ora:tokenize( . ,":"),
$cnt := count($list)
for $val at $r in $list
where $r = $cnt - 1
return $val
else . '
,substr3 varchar2(4000) path 'if (contains( . , ":")) then
let $list := ora:tokenize( . ,":"),
$cnt := count($list)
for $val at $r in $list
where $r = $cnt
return $val
else . '
,lvl FOR ORDINALITY
) xm
您的帮助!
弗拉德
I have a string like : "Att1:Val1,[Txt1,Txt2:Txt3]:Val2"
Using Oracle Sql, I would like to achieve a split into rows & columns as below :
lvl | substr2 | substr3 |
---|---|---|
1 | Att1 | Val1 |
2 | [Txt1,Txt2:Txt3] | Val2 |
I have tried below code, but can't figure out how not to split by comma and colon the values between the brackets
with WTBL as
(
select 'Att1:Val1,[Txt1,Txt2:Txt3]:Val2,' as WCLN
from dual
)
select lvl, substr1, substr2, substr3, WCLN
from WTBL
cross join xmltable('if (contains($PRM,","))
then
let $list := ora:tokenize($PRM, ","),
$cnt := count($list)
for $val at $r in $list
where $r < $cnt
return $val
else $PRM'
passing WCLN as PRM
columns substr1 varchar2(4000) path '.'
,substr2 varchar2(4000) path 'if (contains( . , ":")) then
let $list := ora:tokenize( . ,":"),
$cnt := count($list)
for $val at $r in $list
where $r = $cnt - 1
return $val
else . '
,substr3 varchar2(4000) path 'if (contains( . , ":")) then
let $list := ora:tokenize( . ,":"),
$cnt := count($list)
for $val at $r in $list
where $r = $cnt
return $val
else . '
,lvl FOR ORDINALITY
) xm
Your help is much appreciated!
Vlad
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
更多
发布评论
评论(1)
您可以使用正则表达式
(\ [。*?\] |。*?):(
。字符串函数:
对于示例数据:
两者都输出:
db&lt;费雷尔“>在这里
You can use the regular expression
(\[.*?\]|.*?):(.*?)(,|$)
and a recursive sub-query:Or, simple (faster) string functions:
Which, for the sample data:
Both output:
db<>fiddle here