XMLATTRIBUTES 的 CASE WHEN (SQL oracle)

CASE WHEN for XMLATTRIBUTES (SQL oracle)

我无法在创建 XML 时应用 CASE WHEN THEN
也许我应该使用 IF ELSE,但我正在创建一个常规查询。
我应该有一个条件:

CASE WHEN 1+2=true
 THEN attribute "A"
 ELSE attribute "B"
END

示例:

SELECT XMLROOT(               
               XMLELEMENT("attrib",                          
                          CASE
                            WHEN (1 + 2) = 3 THEN
                             (XMLATTRIBUTES('a' as "A"))
                            ELSE
                             (XMLATTRIBUTES('b' as "B"))                          
                          END))
  FROM dual

来自XMLELEMENT documentation

The objects that make up the element content follow the XMLATTRIBUTES keyword. In the XML_attributes_clause, if the value_expr is null, then no attribute is created for that value expression.

您想将 CASE 表达式放在 XMLATTRIBUTES 中,并且每个属性都有一个:

select XMLROOT(
         XMLELEMENT("attrib",
           XMLATTRIBUTES(
             CASE WHEN 1 + 2 =  3 THEN 'a' END AS "A",
             CASE WHEN 1 + 2 <> 3 THEN 'b' END AS "B"
           )
         ),
         VERSION '1.0'
       ) AS xml
FROM   DUAL;

注意:XMLROOT 还需要 VERSION 参数。

输出:

XML
<?xml version="1.0"?>
<attrib A="a"/>

db<>fiddle here

因为

  • CASE..WHEN 表达式在错误的位置陈述
  • XMLROOT 函数缺少参数
  • 单引号应该包含标识符(a,A,b,B) 而不是 双引号 'A''B' 之前的 EVALNAME 关键字缺失

考虑到这些事实,您可以按如下方式重新排列现有陈述;

SELECT XMLROOT(CASE
                 WHEN 1 + 2 = 3 THEN
                  XMLELEMENT("attrib", XMLATTRIBUTES('a' AS EVALNAME 'A'))
                 ELSE
                  XMLELEMENT("attrib", XMLATTRIBUTES('b' AS EVALNAME 'B'))
               END,
               VERSION '1.0',
               STANDALONE YES)
  FROM dual;

但是 XMLROOT 已弃用 XMLSERIALIZE 函数是 Oracle 推荐的,而不是那个。因此,使用以下替代您的案例

SELECT XMLType(CASE
                 WHEN 1 + 2 = 3 THEN
                   XMLSERIALIZE(
                       CONTENT XMLELEMENT("attrib", XMLATTRIBUTES('a' AS EVALNAME 'A'))
                    VERSION '1.0'
                   )
                ELSE
                   XMLSERIALIZE(
                       CONTENT XMLELEMENT("attrib", XMLATTRIBUTES('b' AS EVALNAME 'B'))
                    VERSION '1.0'
                   )                  
                 END).getStringVal()            
  FROM dual;