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

db<>fiddle