创建系统标识符并将其传递给 PostgreSQL 中的函数

问题描述 投票:0回答:1

我的主要目标是仅在 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/>')

    

sql xml postgresql
1个回答
0
投票
动态 SQL

。这允许将系统标识符作为字符串/文本传递。 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")

© www.soinside.com 2019 - 2024. All rights reserved.