MariaDB EXTRACTVALUE() 函数的基础用法与实例

MariaDB EXTRACTVALUE() 函数,它可以从一个 XML 文档中返回一个 XPath 表达式指定的节点的值。

发布于

MariaDB 是一个开源的关系型数据库管理系统,它是 MySQL 的一个分支,兼容 MySQL 的语法和功能。MariaDB 提供了一些扩展的特性,比如更多的存储引擎,更好的性能,更强的安全性等。

在处理 XML 数据时,MariaDB 提供了一些内置的函数,用于从 XML 文档中提取和查询数据。其中一个常用的函数是 EXTRACTVALUE() 函数,它可以从一个 XML 文档中返回一个 XPath 表达式指定的节点的值。XPath 是一种用于定位 XML 文档中的元素和属性的语言,它可以使用一些简单的语法来表示复杂的查询条件。

语法

EXTRACTVALUE() 函数的语法如下:

EXTRACTVALUE(xml_document, xpath_expression)

其中,xml_document 参数是一个包含 XML 文档的字符串或者一个列名,xpath_expression 参数是一个用于指定要提取的节点的 XPath 表达式。如果 xml_document 参数不是一个有效的 XML 文档,或者 xpath_expression 参数不是一个有效的 XPath 表达式,函数会返回 NULL。如果 XPath 表达式匹配到多个节点,函数会返回第一个匹配的节点的值。如果没有匹配到任何节点,函数会返回一个空字符串。

实例

下面是一些使用 EXTRACTVALUE() 函数的实例,我们使用了一个包含书籍信息的 XML 文档作为示例数据,它的结构如下:

<books>
  <book>
    <title>Harry Potter and the Philosopher's Stone</title>
    <author>J.K. Rowling</author>
    <price>19.99</price>
  </book>
  <book>
    <title>The Lord of the Rings</title>
    <author>J.R.R. Tolkien</author>
    <price>29.99</price>
  </book>
  <book>
    <title>The Hitchhiker's Guide to the Galaxy</title>
    <author>Douglas Adams</author>
    <price>14.99</price>
  </book>
</books>

提取第一本书的标题

我们可以使用如下的 XPath 表达式来提取第一本书的标题:

/books/book[1]/title

这个表达式的意思是,从根节点 <books> 开始,选择第一个子节点 <book>,然后选择它的子节点 <title>。我们可以将这个表达式作为 EXTRACTVALUE() 函数的第二个参数,将 XML 文档作为第一个参数,得到如下的 SQL 语句:

SELECT EXTRACTVALUE('<books>
  <book>
    <title>Harry Potter and the Philosopher''s Stone</title>
    <author>J.K. Rowling</author>
    <price>19.99</price>
  </book>
  <book>
    <title>The Lord of the Rings</title>
    <author>J.R.R. Tolkien</author>
    <price>29.99</price>
  </book>
  <book>
    <title>The Hitchhiker''s Guide to the Galaxy</title>
    <author>Douglas Adams</author>
    <price>14.99</price>
  </book>
</books>', '/books/book[1]/title') AS title;

注意,我们需要将 XML 文档中的单引号 ' 转义为两个单引号 '',以避免与 SQL 语句中的单引号冲突。执行这条语句,我们可以得到如下的结果:

+------------------------------------------+
| title                                    |
+------------------------------------------+
| Harry Potter and the Philosopher's Stone |
+------------------------------------------+

提取所有书的价格

我们可以使用如下的 XPath 表达式来提取所有书的价格:

/books/book/price

这个表达式的意思是,从根节点 <books> 开始,选择所有的子节点 <book>,然后选择它们的子节点 <price>。我们可以将这个表达式作为 EXTRACTVALUE() 函数的第二个参数,将 XML 文档作为第一个参数,得到如下的 SQL 语句:

SELECT EXTRACTVALUE('<books>
  <book>
    <title>Harry Potter and the Philosopher''s Stone</title>
    <author>J.K. Rowling</author>
    <price>19.99</price>
  </book>
  <book>
    <title>The Lord of the Rings</title>
    <author>J.R.R. Tolkien</author>
    <price>29.99</price>
  </book>
  <book>
    <title>The Hitchhiker''s Guide to the Galaxy</title>
    <author>Douglas Adams</author>
    <price>14.99</price>
  </book>
</books>', '/books/book/price') AS price;

执行这条语句,我们可以得到如下的结果:

+-------------------+
| price             |
+-------------------+
| 19.99 29.99 14.99 |
+-------------------+

提取包含特定属性的节点的值

我们可以使用 XPath 表达式中的谓词(predicate)来指定一些条件,用于过滤匹配的节点。例如,我们可以使用如下的 XPath 表达式来提取包含 lang 属性且值为 en 的节点的值:

/books/book[@lang='en']

这个表达式的意思是,从根节点 <books> 开始,选择所有的子节点 <book>,然后过滤掉那些不包含 lang 属性或者 lang 属性的值不等于 en 的节点。我们可以将这个表达式作为 EXTRACTVALUE() 函数的第二个参数,将 XML 文档作为第一个参数,得到如下的 SQL 语句:

SELECT EXTRACTVALUE('<books>
  <book lang="en">
    <title>Harry Potter and the Philosopher''s Stone</title>
    <author>J.K. Rowling</author>
    <price>19.99</price>
  </book>
  <book lang="fr">
    <title>Le Petit Prince</title>
    <author>Antoine de Saint-Exupéry</author>
    <price>9.99</price>
  </book>
  <book lang="en">
    <title>The Hitchhiker''s Guide to the Galaxy</title>
    <author>Douglas Adams</author>
    <price>14.99</price>
  </book>
</books>', '/books/book[@lang="en"]/price') AS book;

执行这条语句,我们可以得到如下的结果:

+-------------+
| book        |
+-------------+
| 19.99 14.99 |
+-------------+

相关函数

除了 EXTRACTVALUE() 函数,MariaDB 还提供了一些其他的函数,用于处理 XML 数据,比如:

  • UPDATEXML() 函数:用于修改一个 XML 文档中的一个或多个节点的值。它可以接受一个 XML 文档,一个 XPath 表达式,和一个新的值作为参数,然后返回一个修改后的 XML 文档。

结论

EXTRACTVALUE() 函数是一个用于从 XML 文档中提取数据的函数,它可以使用 XPath 表达式来指定要提取的节点的位置和条件。它的返回值是一个字符串值,如果匹配到多个节点,它只返回第一个匹配的节点的值。如果想要返回一个 XML 文档的片段,或者返回所有匹配的节点的值,可以使用 XMLQUERY() 函数。MariaDB 还提供了一些其他的函数,用于处理 XML 数据,比如修改,合并,或者转换 XML 文档。