Oracle 12 XMLElement: без тега, если value_expr равно нулю - PullRequest
0 голосов
/ 23 сентября 2019

Доброе утро из Германии.

Теперь, есть ли способ подавить весь тег в XMLElement, если value_expr имеет значение null?

Like: подавить тег "bingo":

SELECT XMLELEMENT( "artno", trim(artno) )
     , XMLELEMENT( "bingo", NULL )
  FROM articlemasterdata
 WHERE artno = '770100C'

<artnr>770100C</artnr>
<bingo></bingo>

Даже XMLTYPE поставляет пустой тег:

SELECT XMLTYPE( XMLELEMENT( "artno", trim(artno) ).getclobval() ) 
    ,  XMLTYPE( XMLELEMENT( "bingo", null ).getclobval() )
  FROM articlemasterdata 
 WHERE artno = '770100C';

<artnr>770100C</artnr>
<bingo></bingo>

Спасибо,

Иоахим

1 Ответ

2 голосов
/ 23 сентября 2019

Вы можете использовать xmlforest вместо xmlelement:

-- CTE for dummy table
with articlemasterdata (artno) as (select '770100C' from dual)
-- actual query
SELECT XMLELEMENT( "artno", trim(artno) )
     , XMLFOREST(NULL as "bingo")
  FROM articlemasterdata
 WHERE artno = '770100C';

XMLELEMENT("ARTNO",TRIM(ARTNO))                                                  XMLFOREST(NULLAS"BINGO")                                                        
-------------------------------------------------------------------------------- --------------------------------------------------------------------------------
<artno>770100C</artno>                                                                                                                                           

Или, возможно, чуть более реалистично:

-- CTE for dummy table
with articlemasterdata (artno, bingo) as (
  select '770100A', 'legs eleven' from dual
  union all
  select '770100C', null from dual
)
-- actual query
SELECT XMLELEMENT( "artno", trim(artno) )
     , XMLFOREST( bingo as "bingo")
  FROM articlemasterdata
 WHERE artno = '770100A'
    OR artno = '770100C';

XMLELEMENT("ARTNO",TRIM(ARTNO))                                                  XMLFOREST(BINGOAS"BINGO")                                                       
-------------------------------------------------------------------------------- --------------------------------------------------------------------------------
<artno>770100A</artno>                                                           <bingo>legs eleven</bingo>                                                      
<artno>770100C</artno>                                                                                                                                           

или даже:

SELECT XMLELEMENT( "root",
         XMLELEMENT( "artno", trim(artno) )
       , XMLFOREST( bingo as "bingo")
       )
  FROM articlemasterdata
 WHERE artno = '770100A'
    OR artno = '770100C';

XMLELEMENT("ROOT",XMLELEMENT("ARTNO",TRIM(ARTNO)),XMLFOREST(BINGOAS"BINGO"))    
--------------------------------------------------------------------------------
<root><artno>770100A</artno><bingo>legs eleven</bingo></root>
<root><artno>770100C</artno></root>
...