EXTRACTVALUE
Синтаксис
EXTRACTVALUE(xml_frag, xpath_expr)
Описание
Функция EXTRACTVALUE() принимает два строковых аргумента: фрагмент XML-разметки и выражение XPath (также известное как локатор). Она возвращает текст (то есть CDDATA) первого текстового узла, являющегося потомком элемента или элементов, соответствующих выражению XPath.
В случаях, когда действительное выражение XPath не соответствует никаким текстовым узлам в корректном XML-фрагменте (включая неявное выражение /text()), функция EXTRACTVALUE() возвращает пустую строку.
Некорректные аргументы
Когда либо XML-фрагмент, либо выражение XPath является NULL, функция EXTRACTVALUE() возвращает NULL. Если XML-фрагмент некорректен, генерируется предупреждение с кодом 1525:
Warning (Code 1525): Incorrect XML value: 'parse error at line 1 pos 11: unexpected END-OF-INPUT'
Если значение XPath некорректно, генерируется ошибка 1105:
ERROR 1105 (HY000): XPATH syntax error: ')'
Явные выражения text()
Эта функция эквивалентна выполнению совпадения с помощью выражения XPath после добавления /text(). Другими словами:
SELECT
EXTRACTVALUE('<cases><case>example</case></cases>', '/cases/case')
AS 'Base Example',
EXTRACTVALUE('<cases><case>example</case></cases>', '/cases/case/text()')
AS 'text() Example';
+--------------+----------------+
| Base Example | text() Example |
+--------------+----------------+
| example | example |
+--------------+----------------+
Подсчёт совпадений
Когда функция EXTRACTVALUE() возвращает несколько совпадений, она возвращает содержимое первого текстового узла-потомка каждого соответствующего элемента в порядке совпадения в виде одной строки, разделённой пробелами.
По умолчанию, функция EXTRACTVALUE() не различает совпадение с пустым элементом и полное отсутствие совпадений. Если необходимо определить, не было ли найдено ни одного соответствующего элемента в XML-фрагменте или был найден элемент, не содержащий текстовых узлов-потомков, используйте функцию XPath count().
Например, при поиске значения, которое существует, но не содержит текстовых узлов-потомков, вы получите количество соответствующих экземпляров:
SELECT
EXTRACTVALUE('<cases><case/></cases>', '/cases/case')
AS 'Empty Example',
EXTRACTVALUE('<cases><case/></cases>', 'count(/cases/case)')
AS 'count() Example';
+---------------+-----------------+
| Empty Example | count() Example |
+---------------+-----------------+
| | 1 |
+---------------+-----------------+
В противном случае, когда искомое значение не существует, функция count() возвращает 0.
SELECT
EXTRACTVALUE('<cases><case/></cases>', '/cases/person')
AS 'No Match Example',
EXTRACTVALUE('<cases><case/></cases>', 'count(/cases/person)')
AS 'count() Example';
+------------------+-----------------+
| No Match Example | count() Example |
+------------------+-----------------+
| | 0|
+------------------+-----------------+
Совпадения
Важно: Функция EXTRACTVALUE() возвращает только CDDATA. Она не возвращает теги, которые может содержать элемент, или текст, содержащийся в этих дочерних элементах.
SELECT
EXTRACTVALUE('<cases><case>Person<email>x@example.com</email></case></cases>', '/cases')
AS Case;
+--------+
| Case |
+--------+
| Person |
+--------+
Обратите внимание, что в приведенном выше примере, хотя выражение XPath соответствует родительскому элементу <case>, оно не возвращает содержащийся <email> тег или его содержимое.
Примеры
SELECT
ExtractValue('<a>ccc<b>ddd</b></a>', '/a') AS val1,
ExtractValue('<a>ccc<b>ddd</b></a>', '/a/b') AS val2,
ExtractValue('<a>ccc<b>ddd</b></a>', '//b') AS val3,
ExtractValue('<a>ccc<b>ddd</b></a>', '/b') AS val4,
ExtractValue('<a>ccc<b>ddd</b><b>eee</b></a>', '//b') AS val5;
+------+------+------+------+---------+
| val1 | val2 | val3 | val4 | val5 |
+------+------+------+------+---------+
| ccc | ddd | ddd | | ddd eee |
+------+------+------+------+---------+
© 2023 MariaDB
Licensed under the Creative Commons Attribution 3.0 Unported License and the GNU Free Documentation License.
https://mariadb.com/kb/en/extractvalue/