如何计算标签在CLOB PLSQL oracle中出现的次数11g



我在表中有一个clob列。在这个clob中,我有一个XML,我想计算一个标签在这个clob中出现的次数。

例如:

<TPQ>       
<LTP>N<LTP> 
<SUBLTP>N</SUBLTP>
<TIMES>446</TIMES>
<TIMES>321</TIMES>
<TIMES>546</TIMES>
<TIMES>547</TIMES>
<LTP>N</LTP>    
<LTP2>N<LTP2>   
<SUBLTP>N</SUBLTP>
<NODES>1</NODES>
<NODES>2</NODES>
<NODES>3</NODES>
<NODES>4</NODES>
<SUBLTP>H</SUBLTP>
<SUBLTP3>A</SUBLTP3>
<SUBLTP2>N</SUBLTP2>
<LTP2>N</LTP2>  
</TPQ>

我想知道标签"TIMES"出现4,标记"NODES"出现4次。

我使用这个查询获得所有的时间标签,但我需要知道如何计数:

SELECT EXTRACT(xmltype.createxml(T.columnCLOB), '//TPQ/LTP/TIMES').getStringVal()
FROM table1 T; 

,结果是:

Select语句的结果是

<TIMES>446</TIMES><TIMES>321</TIMES><TIMES>546</TIMES><TIMES>547</TIMES>

这在一个例子中,我需要一个动态clob列的解决方案,可以有x标签在里面,并不总是具有相同的结构。但是我只需要知道一个指定的标签出现了多少次。

您可以使用:

SELECT t.id,
x.tag_name,
COUNT(*)
FROM   table_name t
CROSS JOIN XMLTABLE(
'//*'
PASSING XMLTYPE(t.xml) 
COLUMNS 
tag_name varchar2(100) path 'name()'    
) x
GROUP BY t.id, x.tag_name

对于样本数据:

CREATE TABLE table_name (id NUMBER, xml CLOB);
INSERT INTO table_name (id, xml)
VALUES (1, '<TPQ>       
<LTP>N</LTP> 
<SUBLTP>N</SUBLTP>
<TIMES>446</TIMES>
<TIMES>321</TIMES>
<TIMES>546</TIMES>
<TIMES>547</TIMES>
<LTP>N</LTP>    
<LTP2>N</LTP2>   
<SUBLTP>N</SUBLTP>
<NODES>1</NODES>
<NODES>2</NODES>
<NODES>3</NODES>
<NODES>4</NODES>
<SUBLTP>H</SUBLTP>
<SUBLTP3>A</SUBLTP3>
<SUBLTP2>N</SUBLTP2>
<LTP2>N</LTP2>  
</TPQ>');

输出:TAG_NAMECOUNT (*)3

可以使用XPATH函数

with
x as
(select xmltype('<TPQ><LTP>N</LTP><SUBLTP>N</SUBLTP>
<TIMES>446</TIMES><TIMES>321</TIMES><TIMES>546</TIMES><TIMES>547</TIMES>
<LTP>N</LTP><LTP2>N</LTP2><SUBLTP>N</SUBLTP>
<NODES>1</NODES><NODES>2</NODES><NODES>3</NODES><NODES>4</NODES>
<SUBLTP>H</SUBLTP><SUBLTP3>A</SUBLTP3><SUBLTP2>N</SUBLTP2><LTP2>N</LTP2></TPQ>') xval
from dual)
select z.*
from x, xmltable ('count(/TPQ/TIMES)' passing x.xval) z;

最新更新