XMLType 从第一个节点中提取唯一值 ID
XMLType Extract Distinct Value ID from a first node
你能帮我解决以下问题吗?例如,我只需要 person_number 一次。 1000142
但我得到 10001421000142 是这样的。
因为我在 xml 单元格中的值有重复数字,
所以我只想提取一个唯一的人号。
select xmltype( '<?xml version="1.0"?>
<ROWSET>
<ROW> <PERSON_NUMBER>1000142</PERSON_NUMBER> <LOAN_1>25000</LOAN_1> <LOAN_2>26000</LOAN_2> </ROW>
<ROW> <PERSON_NUMBER>1000142</PERSON_NUMBER> <LOAN_1>25000</LOAN_1> <LOAN_2>26000</LOAN_2> </ROW>
</ROWSET>').extract( '//PERSON_NUMBER[1]/text()' ) .getstringval() p# from dual;
正如我 当你问这个作为你上一个问题的 follow-up 时,使用 XPATH:
/ROWSET/ROW[1]/PERSON_NUMBER/text()
然后:
select xmltype(
'<?xml version="1.0"?>
<ROWSET>
<ROW>
<PERSON_NUMBER>1000142</PERSON_NUMBER>
<LOAN_1>25000</LOAN_1>
<LOAN_2>26000</LOAN_2>
</ROW>
<ROW>
<PERSON_NUMBER>1000142</PERSON_NUMBER>
<LOAN_1>25000</LOAN_1>
<LOAN_2>26000</LOAN_2>
</ROW>
</ROWSET>'
).extract( '/ROWSET/ROW[1]/PERSON_NUMBER/text()' ) .getstringval() p#
from dual;
输出:
P#
1000142
如果您确实想提取所有 PERSON_NUMBER
值,然后只找到 DISTINCT
个值,那么您可以使用:
SELECT DISTINCT p#
from XMLTABLE(
'/ROWSET/ROW'
PASSING xmltype(
'<?xml version="1.0"?>
<ROWSET>
<ROW>
<PERSON_NUMBER>1000142</PERSON_NUMBER>
<LOAN_1>25000</LOAN_1>
<LOAN_2>26000</LOAN_2>
</ROW>
<ROW>
<PERSON_NUMBER>1000142</PERSON_NUMBER>
<LOAN_1>25000</LOAN_1>
<LOAN_2>26000</LOAN_2>
</ROW>
</ROWSET>'
)
COLUMNS
p# NUMBER PATH './PERSON_NUMBER'
);
其中,示例数据输出同上。
db<>fiddle here
你也可以使用这样的东西:
WITH tbl AS
(
SELECT XMLTYPE(
'<?xml version="1.0"?>
<ROWSET>
<ROW> <PERSON_NUMBER>1000142</PERSON_NUMBER> <LOAN_1>25000</LOAN_1> <LOAN_2>26000</LOAN_2> </ROW>
<ROW> <PERSON_NUMBER>1000142</PERSON_NUMBER> <LOAN_1>25000</LOAN_1> <LOAN_2>26000</LOAN_2> </ROW>
</ROWSET>'
) xmldata
FROM dual
)
SELECT node_name, node_value
FROM tbl
, XMLTABLE('//*'
PASSING tbl.xmldata
COLUMNS node_name VARCHAR2(100) path 'name()'
, node_value VARCHAR2(400) path 'text()')
WHERE node_name = 'PERSON_NUMBER';
如果您只想要第一行的人员编号,那么您的 XPath 应该是:
'/ROWSET/ROW[1]/PERSON_NUMBER/text()'
而不是从每个 ROW
中获取第一个 PERSON_NUMBER
。
如果你的 XML 可以有几个不同的人号,其中一些或全部重复,然后用 XMLTable 得到所有的人,然后得到不同的值:
select distinct x.person_number
from xmltable(
'/ROWSET/ROW'
passing xmltype( '<?xml version="1.0"?>
<ROWSET>
<ROW> <PERSON_NUMBER>1000142</PERSON_NUMBER> <LOAN_1>25000</LOAN_1> <LOAN_2>26000</LOAN_2> </ROW>
<ROW> <PERSON_NUMBER>1000142</PERSON_NUMBER> <LOAN_1>25000</LOAN_1> <LOAN_2>26000</LOAN_2> </ROW>
</ROWSET>')
columns person_number number path 'PERSON_NUMBER'
) x
你能帮我解决以下问题吗?例如,我只需要 person_number 一次。 1000142 但我得到 10001421000142 是这样的。
因为我在 xml 单元格中的值有重复数字, 所以我只想提取一个唯一的人号。
select xmltype( '<?xml version="1.0"?>
<ROWSET>
<ROW> <PERSON_NUMBER>1000142</PERSON_NUMBER> <LOAN_1>25000</LOAN_1> <LOAN_2>26000</LOAN_2> </ROW>
<ROW> <PERSON_NUMBER>1000142</PERSON_NUMBER> <LOAN_1>25000</LOAN_1> <LOAN_2>26000</LOAN_2> </ROW>
</ROWSET>').extract( '//PERSON_NUMBER[1]/text()' ) .getstringval() p# from dual;
正如我
/ROWSET/ROW[1]/PERSON_NUMBER/text()
然后:
select xmltype(
'<?xml version="1.0"?>
<ROWSET>
<ROW>
<PERSON_NUMBER>1000142</PERSON_NUMBER>
<LOAN_1>25000</LOAN_1>
<LOAN_2>26000</LOAN_2>
</ROW>
<ROW>
<PERSON_NUMBER>1000142</PERSON_NUMBER>
<LOAN_1>25000</LOAN_1>
<LOAN_2>26000</LOAN_2>
</ROW>
</ROWSET>'
).extract( '/ROWSET/ROW[1]/PERSON_NUMBER/text()' ) .getstringval() p#
from dual;
输出:
P# 1000142
如果您确实想提取所有 PERSON_NUMBER
值,然后只找到 DISTINCT
个值,那么您可以使用:
SELECT DISTINCT p#
from XMLTABLE(
'/ROWSET/ROW'
PASSING xmltype(
'<?xml version="1.0"?>
<ROWSET>
<ROW>
<PERSON_NUMBER>1000142</PERSON_NUMBER>
<LOAN_1>25000</LOAN_1>
<LOAN_2>26000</LOAN_2>
</ROW>
<ROW>
<PERSON_NUMBER>1000142</PERSON_NUMBER>
<LOAN_1>25000</LOAN_1>
<LOAN_2>26000</LOAN_2>
</ROW>
</ROWSET>'
)
COLUMNS
p# NUMBER PATH './PERSON_NUMBER'
);
其中,示例数据输出同上。
db<>fiddle here
你也可以使用这样的东西:
WITH tbl AS
(
SELECT XMLTYPE(
'<?xml version="1.0"?>
<ROWSET>
<ROW> <PERSON_NUMBER>1000142</PERSON_NUMBER> <LOAN_1>25000</LOAN_1> <LOAN_2>26000</LOAN_2> </ROW>
<ROW> <PERSON_NUMBER>1000142</PERSON_NUMBER> <LOAN_1>25000</LOAN_1> <LOAN_2>26000</LOAN_2> </ROW>
</ROWSET>'
) xmldata
FROM dual
)
SELECT node_name, node_value
FROM tbl
, XMLTABLE('//*'
PASSING tbl.xmldata
COLUMNS node_name VARCHAR2(100) path 'name()'
, node_value VARCHAR2(400) path 'text()')
WHERE node_name = 'PERSON_NUMBER';
如果您只想要第一行的人员编号,那么您的 XPath 应该是:
'/ROWSET/ROW[1]/PERSON_NUMBER/text()'
而不是从每个 ROW
中获取第一个 PERSON_NUMBER
。
如果你的 XML 可以有几个不同的人号,其中一些或全部重复,然后用 XMLTable 得到所有的人,然后得到不同的值:
select distinct x.person_number
from xmltable(
'/ROWSET/ROW'
passing xmltype( '<?xml version="1.0"?>
<ROWSET>
<ROW> <PERSON_NUMBER>1000142</PERSON_NUMBER> <LOAN_1>25000</LOAN_1> <LOAN_2>26000</LOAN_2> </ROW>
<ROW> <PERSON_NUMBER>1000142</PERSON_NUMBER> <LOAN_1>25000</LOAN_1> <LOAN_2>26000</LOAN_2> </ROW>
</ROWSET>')
columns person_number number path 'PERSON_NUMBER'
) x