MariaDB
 sql >> Database >  >> RDS >> MariaDB

Come funziona EXTRACTVALUE() in MariaDB

In MariaDB, EXTRACTVALUE() è una funzione di stringa incorporata che restituisce CDATA da un frammento XML.

Il modo in cui funziona è che accetta due argomenti stringa:un frammento di markup XML e un'espressione XPath (cioè un localizzatore). EXTRACTVALUE() quindi restituisce il CDATA (cioè il testo) del primo nodo di testo che è figlio dell'elemento o degli elementi corrispondenti all'espressione XPath.

Sintassi

La sintassi è questa:

EXTRACTVALUE(xml_frag, xpath_expr)

Dove xml_frag è il frammento XML e xpath_expr è l'espressione XPath da abbinare.

Esempio

Ecco un esempio di base:

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

Risultato:

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

In questo caso, l'XPath è /type , e quindi restituisce il CDATA (testo) dal type elemento.

Eccone un altro:

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

Risultato:

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

In questo caso, l'XPath è /user , e così EXTRACTVALUE() restituisce il CDATA dall'user elemento.

Nota che non ha restituito iq elemento o il suo testo. C'è da aspettarselo, perché EXTRACTVALUE() restituisce solo il CDATA. Non restituisce alcun elemento figlio o testo che potrebbero contenere.

Utilizzo dell'espressione text()

È l'equivalente di ottenere una corrispondenza aggiungendo l'esplicito text() espressione:

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

Risultato:

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

Elementi nidificati

Ecco un esempio di come ottenere CDATA da un elemento nidificato:

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

Risultato:

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

Qui, abbiamo ottenuto il CDATA da iq elemento, che è nidificato all'interno di user elemento. Abbiamo ottenuto questo risultato utilizzando /user/iq come XPath.

Nessuna corrispondenza

Se non esiste alcun elemento di questo tipo, non viene restituito nulla.

Esempio:

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

Risultato:

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

Questo è anche il caso se sbagli l'annidamento.

Esempio:

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

Risultato:

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

Qui abbiamo usato /iq come XPath quando avremmo dovuto usare /user/iq .

XML vuoto

Un documento XML vuoto produrrà un risultato vuoto:

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

Risultato:

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

XPath vuoto

Un XPath vuoto restituisce un errore:

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

Risultato:

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

XML nullo

Fornendo null poiché il primo argomento genera un errore:

SELECT EXTRACTVALUE(null, '');

Risultato:

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

Percorso XP nullo

Fornendo null poiché il secondo argomento restituisce null :

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

Risultato:

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

Fornire un solo argomento

Fornire un singolo argomento genera un errore:

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

Risultato:

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

Argomento mancante

Chiamando EXTRACTVALUE() senza passare alcun argomento genera un errore:

SELECT EXTRACTVALUE();

Risultato:

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

Introduzione a XML

Per ulteriori informazioni su XML, vedere il mio tutorial XML su Quackit. Quel tutorial include anche un'introduzione a XPath.