在编写来自XML列的oracle查询时需要帮助

时间:2019-11-26 07:09:01

标签: sql xml oracle

我在oracle表XML列中具有以下XML:

<?xml version="1.0" encoding="UTF-8"?>
<Employee>
  <Emp_information emp_name="SSS">
  </Emp_information>
  <emp_content>
    <emp_part part_id="A" >
       <emp_scoring_information equivalent_value="Test" >
        <empset empset_weight="1">
          <emp_key value="1"/>
        </empset>
      </emp_scoring_information>
    </emp_part>
    <emp_part part_id="B" >
      <emp_scoring_information equivalent_value_flag="Test1" >
        <empset empset_weight="1" >
          <emp_key value="1"/>
          <emp_key value="2"/>
        </empset>
      </emp_scoring_information>
    </emp_part>
  </emp_content>
</Employee>

我正在尝试使用oracle查询以以下格式显示值

A=1,B=1,2

如何解决此问题,以使用SQL查询打印以下格式的数据?

我想详细解释输出值(A = 1,B = 1,2)(A = 1)A是emp_part中的值(part_id值)=是静态值,1是empset中的值emp_key值,就像它对下一个emp_part也需要做同样的事情一样(part_id B)具有多个emp_key值的empset,在这种情况下,它需要显示B = 1,2,每个emppart都用逗号分隔(A = 1,B = 1,2)。

1 个答案:

答案 0 :(得分:2)

with src as (select xmltype('<Employee>
  <Emp_information emp_name="SSS">
  </Emp_information>
  <emp_content>
    <emp_part part_id="A" >
       <emp_scoring_information equivalent_value="Test" >
        <empset empset_weight="1">
          <emp_key value="1"/>
        </empset>
      </emp_scoring_information>
    </emp_part>
    <emp_part part_id="B" >
      <emp_scoring_information equivalent_value_flag="Test1" >
        <empset empset_weight="1" >
          <emp_key value="1"/>
          <emp_key value="2"/>
        </empset>
      </emp_scoring_information>
    </emp_part>
  </emp_content>
</Employee>') xml  from dual)
select xmlquery('string-join($d/Employee/emp_content/emp_part/concat(@part_id,"=",string-join(emp_scoring_information/empset/emp_key/@value,",") ),",")' passing xml as "d" returning content) from src

string-join-使用分隔符连接字符串序列
concat-连接字符串str1 + str2 +等。

它的工作原理类似于两个循环,第一个循环选择@part_id,第二个循环选择并聚集依赖的@values