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
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;
我无法在创建 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
The objects that make up the element content follow the
XMLATTRIBUTES
keyword. In theXML_attributes_clause
, if thevalue_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;