在 PostgreSQL 中动态处理 XML 属性
Handling XML Attribute in dynamically in PostgreSQL
我需要从 XML 中读取属性。下面是一个示例 xml
<users userid="79132e61-df0a-4af5-95db-92d8bb492c84" username="test" birthdate="2000-03-10" nationality="USA"/>
我正在使用下面的代码从这个 XML.
中读取属性
with cte (xmlcontent) as
(
select '<users userid="79132e61-df0a-4af5-95db-92d8bb492c84" username="test" birthdate="2000-03-10" nationality="USA"/>'::xml )
select Unnest(xpath('//@userid',XMLCONTENT))::text::uuid,
Unnest(xpath('//@username',XMLCONTENT))::text,
Unnest(xpath('//@nationality',XMLCONTENT))::text
from cte;
问题是,nationality
不是此 xml 的强制属性。当 XML.
中不存在 nationality
时,我的查询不会产生任何结果
如何修改我的查询来处理这种情况?
我找到的一个解决方案是使用 XMLEXISTS.
下面的查询对我来说绝对没问题
with cte (xmlcontent) as
(
select '<users userid="79132e61-df0a-4af5-95db-92d8bb492c84" username="test" birthdate="2000-03-10" nationality="USA"/>'::xml )
select Unnest(xpath('//@userid',XMLCONTENT))::text::uuid,
Unnest(xpath('//@username',XMLCONTENT))::text,
case when xmlexists('//@nationality' passing XMLCONTENT) then Unnest(xpath('//@nationality',XMLCONTENT))::text else null end
from cte
我需要从 XML 中读取属性。下面是一个示例 xml
<users userid="79132e61-df0a-4af5-95db-92d8bb492c84" username="test" birthdate="2000-03-10" nationality="USA"/>
我正在使用下面的代码从这个 XML.
中读取属性with cte (xmlcontent) as
(
select '<users userid="79132e61-df0a-4af5-95db-92d8bb492c84" username="test" birthdate="2000-03-10" nationality="USA"/>'::xml )
select Unnest(xpath('//@userid',XMLCONTENT))::text::uuid,
Unnest(xpath('//@username',XMLCONTENT))::text,
Unnest(xpath('//@nationality',XMLCONTENT))::text
from cte;
问题是,nationality
不是此 xml 的强制属性。当 XML.
nationality
时,我的查询不会产生任何结果
如何修改我的查询来处理这种情况?
我找到的一个解决方案是使用 XMLEXISTS.
下面的查询对我来说绝对没问题
with cte (xmlcontent) as
(
select '<users userid="79132e61-df0a-4af5-95db-92d8bb492c84" username="test" birthdate="2000-03-10" nationality="USA"/>'::xml )
select Unnest(xpath('//@userid',XMLCONTENT))::text::uuid,
Unnest(xpath('//@username',XMLCONTENT))::text,
case when xmlexists('//@nationality' passing XMLCONTENT) then Unnest(xpath('//@nationality',XMLCONTENT))::text else null end
from cte