sql >> Base de Datos >  >> RDS >> MariaDB

Cómo funciona EXTRACTVALUE() en MariaDB

En MariaDB, EXTRACTVALUE() es una función de cadena incorporada que devuelve CDATA de un fragmento XML.

La forma en que funciona es que acepta dos argumentos de cadena:un fragmento de marcado XML y una expresión XPath (es decir, un localizador). EXTRACTVALUE() luego devuelve el CDATA (es decir, el texto) del primer nodo de texto que es un elemento secundario del elemento o elementos que coinciden con la expresión XPath.

Sintaxis

La sintaxis es así:

EXTRACTVALUE(xml_frag, xpath_expr)

Donde xml_frag es el fragmento XML y xpath_expr es la expresión XPath para hacer coincidir.

Ejemplo

He aquí un ejemplo básico:

SELECT EXTRACTVALUE('<type>Cat</type>', '/type') AS "Result";

Resultado:

+--------+
| Result |
+--------+
| Cat    |
+--------+

En este caso, el XPath es /type , por lo que devuelve el CDATA (texto) del type elemento.

Aquí hay otro:

SELECT EXTRACTVALUE('<user>Homer<iq>Low</iq></user>', '/user') AS "Result";

Resultado:

+--------+
| Result |
+--------+
| Homer  |
+--------+

En este caso, el XPath es /user , y así EXTRACTVALUE() devuelve el CDATA del user elemento.

Observe que no devolvió el iq elemento o su texto. Eso es de esperar, porque EXTRACTVALUE() solo devuelve el CDATA. No devuelve ningún elemento secundario ni ningún texto que puedan contener.

Uso de la expresión text()

Es el equivalente a obtener una coincidencia agregando el text() explícito expresión:

SELECT EXTRACTVALUE('<type>Cat</type>', '/type/text()') AS "Result";

Resultado:

+--------+
| Result |
+--------+
| Cat    |
+--------+

Elementos anidados

Aquí hay un ejemplo de cómo obtener CDATA de un elemento anidado:

SELECT EXTRACTVALUE('<user>Homer<iq>Low</iq></user>', '/user/iq') AS "Result";

Resultado:

+--------+
| Result |
+--------+
| Low    |
+--------+

Aquí, obtuvimos el CDATA del iq elemento, que está anidado dentro del user elemento. Logramos esto usando /user/iq como XPath.

Sin coincidencia

Si no existe tal elemento, no se devuelve nada.

Ejemplo:

SELECT EXTRACTVALUE('<type>Cat</type>', '/name') AS "Result";

Resultado:

+--------+
| Result |
+--------+
|        |
+--------+

Este también es el caso si se equivoca en el anidamiento.

Ejemplo:

SELECT EXTRACTVALUE('<user>Homer<iq>Low</iq></user>', '/iq') AS "Result";

Resultado:

+--------+
| Result |
+--------+
|        |
+--------+

Aquí, usamos /iq como XPath cuando deberíamos haber usado /user/iq .

XML vacío

Un documento XML vacío producirá un resultado vacío:

SELECT EXTRACTVALUE('', '/name') AS "Result";

Resultado:

+--------+
| Result |
+--------+
|        |
+--------+

XPath vacío

Un XPath vacío devuelve un error:

SELECT EXTRACTVALUE('<type>Cat</type>', '');

Resultado:

ERROR 1105 (HY000): XPATH syntax error: ''

XML nulo

Proporcionar null como el primer argumento da como resultado un error:

SELECT EXTRACTVALUE(null, '');

Resultado:

ERROR 1105 (HY000): XPATH syntax error: ''

XPath nulo

Proporcionar null como el segundo argumento devuelve null :

SELECT EXTRACTVALUE('<type>Cat</type>', null) AS "Result";

Resultado:

+--------+
| Result |
+--------+
| NULL   |
+--------+

Proveer un solo argumento

Proporcionar un solo argumento da como resultado un error:

SELECT EXTRACTVALUE('<type>Cat</type>');

Resultado:

ERROR 1582 (42000): Incorrect parameter count in the call to native function 'EXTRACTVALUE'

Argumento faltante

Llamando a EXTRACTVALUE() sin pasar ningún argumento da como resultado un error:

SELECT EXTRACTVALUE();

Resultado:

ERROR 1582 (42000): Incorrect parameter count in the call to native function 'EXTRACTVALUE'

Introducción a XML

Para obtener más información sobre XML, consulte mi Tutorial de XML en Quackit. Ese tutorial también incluye una Introducción a XPath.