我的主要目标是仅在 xml 元素不为空时创建/输出它。如果为空则应返回NULL
。我为此使用本机
xmlelement()
函数。因此,如果我调用 SELECT xmlelement(name "my-element", NULL)
,它将返回 <my-element/>
,而我的目标是在这种情况下返回 NULL
。我尝试简单地包装 xmlelement
函数,如下所示,以便当任何输入参数为
NULL
时它将返回 NULL
:CREATE OR REPLACE FUNCTION xml_noempty_element(label name, data xml) RETURNS xml AS
$$
SELECT xmlelement(label, data)
$$
LANGUAGE SQL IMMUTABLE STRICT;
遗憾的是这并没有得到验证。
是否有可能创建一个采用系统标识符的 PostgreSQL 函数?如果是,我如何创建标识符/名称并将其传递给函数?
我知道我可以执行类似以下代码的操作来实现我的主要目标:
SELECT CASE
WHEN EXISTS(SELECT FROM my_xml_rows) THEN
xmlelement(name "my-element",
( SELECT xmlagg(xmlelement) FROM my_xml_rows )
)
END;
但是这会调用查询两次,我试图避免。
我想我的另一个选择是包裹一个
NULLIF((QUERY), '<my-element/>')
。
。这允许将系统标识符作为字符串/文本传递。
CREATE OR REPLACE FUNCTION xml_noempty_element(tag text, data xml) RETURNS xml AS
$$
DECLARE
retval xml;
BEGIN
EXECUTE format('SELECT xmlelement(name %I,$1)', $1) USING $2 INTO retval;
RETURN retval;
END
$$
LANGUAGE plpgsql IMMUTABLE STRICT;
-- <outer><inner>value</inner></outer>
SELECT xml_noempty_element('outer', xmlelement(name "inner", 'value'));
-- NULL
SELECT xml_noempty_element('outer', NULL);
为了解决我的主要目标,我使用了xmlforest(),如果给定内容也是NULL
,它会返回
NULL
,而不是像xmlelement()
那样返回空的XML元素。SELECT xmlforest('MyValue' AS "ElementTagName")