首页 > 解决方案 > SQL Oracle XML 空标签和属性

问题描述

我对 SQL/XML 和 Oracle 有疑问。我将 Oracle 的示例与 dept 和 emp 一起使用。一开始的情况:我想要一个带有部门和员工的xml:

SELECT Xmlelement("employees", dept.deptno, Xmlagg(
       Xmlelement("employee", ename))).
       getStringVal()
FROM   emp
       INNER JOIN dept
               ON dept.deptno = emp.deptno
GROUP  BY dept.deptno; 

现在我想要所有部门,即使没有任何员工(右外部联接)。此外,我想要员工的一些属性:

SELECT XMLELEMENT("employees", dept.deptno, 
       Xmlagg(
        XMLELEMENT("employee",
             xmlattributes(empno AS "empno", sal AS "salary"), ename)
        )
        ).getStringVal()
FROM   emp
       right outer join dept
                     ON dept.deptno = emp.deptno
GROUP  BY dept.deptno; 

但是现在没有员工的部门有一个空标签“员工”。我有这个问题的解决方案:

SELECT           xmlelement("employees", 
                    xmlattributes(dept.deptno as "Abt"), 
                    xmlagg( xmlforest(ename AS "employee") )
                 ).getstringval()
FROM             emp
RIGHT OUTER JOIN dept
ON               dept.deptno = emp.deptno
GROUP BY         dept.deptno;

现在我没有空标签,但我无法放置我想要的属性。这个问题有什么解决办法吗?

最好的问候

标签: sqlxmloracle

解决方案


使用这个答案,您可以添加DELETXML到您的第二个查询

SELECT DELETEXML(
     XMLELEMENT("employees", dept.deptno, 
       Xmlagg(
        XMLELEMENT("employee",
             xmlattributes(empno AS "empno", sal AS "salary"), ename)
        )
        ),
         '//*[not(text())][not(*)]'
       ).getStringVal()
FROM   emp
       right outer join dept
                     ON dept.deptno = emp.deptno
GROUP  BY dept.deptno;

样本输出

<employees>1<employee empno="1" salary="100">name1</employee></employees>
<employees>2<employee empno="2" salary="100">name2</employee></employees>
<employees>3<employee empno="3" salary="100">name3</employee></employees>
<employees>4</employees>
<employees>5</employees>

推荐阅读