SQL Oracle XML пустые теги и атрибуты - PullRequest
0 голосов
/ 12 февраля 2019

У меня проблема с 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;

Теперь у меня нет пустого тега, но я не могу разместить нужные атрибуты.Есть ли решение этой проблемы?

С наилучшими пожеланиями ses

Ответы [ 2 ]

0 голосов
/ 12 февраля 2019

Вы можете использовать выражение case, чтобы не генерировать мошеннический узел <employee/>, во-первых:

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

XMLELEMENT("EMPLOYEES",DEPT.DEPTNO,XMLAGG(CASEWHENEMP.EMPNOISNOTNULLTHENXMLELEMENT("EMPLOYEE",XMLATTRIBUTES(EMPNOAS"EMPNO",SALAS"SALARY"),ENAME)END)).GETSTRINGVAL()
--------------------------------------------------------------------------------------------------------------------------------------------------------------------
<employees>10<employee empno="7839" salary="5000">KING</employee><employee empno="7934" salary="1300">MILLER</employee><employee empno="7782" salary="2450">CLARK</employee></employees>
<employees>20<employee empno="7566" salary="2975">JONES</employee><employee empno="7876" salary="1100">ADAMS</employee><employee empno="7369" salary="800">SMITH</employee><employee empno="7902" salary="3000">FORD</employee><employee empno="7788" salary="3000">SCOTT</employee></employees>
<employees>30<employee empno="7698" salary="2850">BLAKE</employee><employee empno="7900" salary="950">JAMES</employee><employee empno="7844" salary="1500">TURNER</employee><employee empno="7654" salary="1250">MARTIN</employee><employee empno="7521" salary="1250">WARD</employee><employee empno="7499" salary="1600">ALLEN</employee></employees>
<employees>40</employees>
0 голосов
/ 12 февраля 2019

Используя этот ответ вы можете добавить 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>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...