PostgreSQL 数据类型及语句-xml 字段及操作

作者:vkvi 来源:ITPOW(原创) 日期:2021-5-11

基础存储与 xpath 查询

update tbl set data='<root><a>1</a></root>';
select xpath('//a/text()', data) from tbl;

data 字段类型为 xml。插入时,要不要指明 <?xml version="1.0"?> 都可以,指明了也会被忽略。

如上,假设数据库中有 1 条记录,那么结果为:

{1}

update tbl set data='<root><a>1</a><a>2</a></root>';
select xpath('//a/text()', data) from tbl;

结果为:

{1,2}

关于 xpath,请参见:XmlDocument-SelectNodes 与 XPath

使用 unnest 拆开

前面可以看到,哪怕只有 1 个结果,也是以数组的方式包起来的,我们可以使用 unnest 拆开,但是拆开后,会是多条记录。

update tbl set data='<root><a>1</a><a>2</a></root>';
select unnest(xpath('//a/text()', data)) from tbl;

结果为 2 条:

1

2

array_to_string

xpath 查出来后,是数组。用 unnest 拆开,它仍是 xml 格式,不能直接与字符串比较。

update tbl set data='<root><a>1</a><a>2</a></root>';
select * from tbl where array_to_string(xpath('//a[1]/text()', data), '')='1';

如上,由于有 a[1],故表示第 1 个 a 节点的内容是 1 的,被查出来。

array_to_string 的第二个参数是:当有多条内容时,用它来连接,形成一个字符串,但是我们查询的是 a[1],所以最多只能出来 1 个结果,所以第 2 个参数在这里没意义。

再看看第 2 个参数用起来的情况:

update tbl set data='<root><a>1</a><a>2</a></root>';
select array_to_string(xpath('//a/text()', data), '/') from tbl;

结果为:

1/2

xmlparsedocument 将字符串转换成 xml

前面的 xml 是一个整的字符串,它被当作 xml 来插入,但是如果我们是连接的字符串,它就不认识了,需要我们转换一下,这就需要两个关键词:xmlparse、document(大小写都可以)。

update tbl set data=xmlparse(document'<root><a>1'||'</a></root>');

如上,使用 || 连接了 2 个字符串,再用 xmlparse、document 去转换。

相关文章