如何在clob中第n次出现数据时检索列表?
clob示例:
<bank>
<bankDetails>
<bankDetailsList>
<pk>1</pk>
<accountName>
<asCurrent>EDGARS LESOTHO</asCurrent>
</accountName>
<bankAccountType>
<asCurrent>CURR</asCurrent>
</bankAccountType>
</bankDetailsList>
<bankDetailsList>
<pk>2</pk>
<accountName>
<asCurrent>EDGARS LESOTHO 2</asCurrent>
</accountName>
<bankAccountType>
<asCurrent>CURR</asCurrent>
</bankAccountType>
</bankDetailsList>
</bankDetails>
</bank>
所以我想在sql中检索帐户名的所有值,假设在clob中可能存在最多n个此帐户名列表。
我使用的是oracle 11g和SqlDeveloper 4.1.3 非常感谢您的回复。
答案 0 :(得分:1)
SELECT EXTRACTVALUE( v.COLUMN_VALUE, '/asCurrent' )
FROM table_name t,
TABLE(
XMLSequence(
EXTRACT(
XMLType( t.clob_column ),
'/bank/bankDetails/bankDetailsList/accountName/asCurrent'
)
)
) v
答案 1 :(得分:0)
SELECT level as rnk, regexp_substr(t.clob_column,
'<accountName>[^<]*?<asCurrent>([^<]*?)<', 1, level, null, 1) as acct_name
FROM t
CONNECT BY level <= (select regexp_count(clob_column, '<accountName>') FROM t);
t是表名,clob_column是具有clob值的列(在我的测试用例中,表有一行和一列,值是原始帖子中的值)。
如果你有一列clob值并且需要同时为多个值执行此操作,则需要稍微修改一下;请澄清要求,我们可以从那里接受。
已添加:要使其适用于多行,您需要修改CONNECT BY LEVEL子句。您希望每行仅引用自身;并且为了避免循环问题,您需要再添加一个条件。像这样:
...
CONNECT BY level <= (select regexp_count(clob_column, '<accountName>') FROM t)
and clob_column= prior clob_column
and prior sys_guid() is not null;