sql >> Database >  >> RDS >> MariaDB

Hoe EXTRACTVALUE() werkt in MariaDB

In MariaDB, EXTRACTVALUE() is een ingebouwde tekenreeksfunctie die CDATA retourneert uit een XML-fragment.

De manier waarop het werkt, is dat het twee stringargumenten accepteert:een fragment van XML-opmaak en een XPath-expressie (d.w.z. een locator). EXTRACTVALUE() retourneert vervolgens de CDATA (d.w.z. de tekst) van het eerste tekstknooppunt dat een kind is van het element of de elementen die overeenkomen met de XPath-expressie.

Syntaxis

De syntaxis gaat als volgt:

EXTRACTVALUE(xml_frag, xpath_expr)

Waar xml_frag is het XML-fragment, en xpath_expr is de XPath-expressie die overeenkomt.

Voorbeeld

Hier is een eenvoudig voorbeeld:

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

Resultaat:

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

In dit geval is de XPath /type , en dus retourneert het de CDATA (tekst) van het type element.

Hier is er nog een:

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

Resultaat:

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

In dit geval is de XPath /user , en dus EXTRACTVALUE() retourneert de CDATA van de user element.

Merk op dat het de iq . niet retourneerde element of de tekst ervan. Dat is te verwachten, want EXTRACTVALUE() retourneert alleen de CDATA. Het retourneert geen onderliggende elementen of tekst die ze kunnen bevatten.

De text()-expressie gebruiken

Het is het equivalent van het verkrijgen van een overeenkomst door de expliciete text() . toe te voegen uitdrukking:

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

Resultaat:

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

Geneste elementen

Hier is een voorbeeld van het ophalen van CDATA uit een genest element:

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

Resultaat:

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

Hier hebben we de CDATA van de iq element, dat is genest in de user element. We hebben dit bereikt door /user/iq . te gebruiken als de XPath.

Geen overeenkomst

Als zo'n element niet bestaat, wordt er niets geretourneerd.

Voorbeeld:

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

Resultaat:

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

Dit is ook het geval als je de nesting verkeerd doet.

Voorbeeld:

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

Resultaat:

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

Hier gebruikten we /iq als de XPath terwijl we /user/iq . hadden moeten gebruiken .

Lege XML

Een leeg XML-document zal een leeg resultaat opleveren:

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

Resultaat:

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

Lege XPath

Een lege XPath retourneert een fout:

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

Resultaat:

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

Null-XML

null opgeven als het eerste argument resulteert in een fout:

SELECT EXTRACTVALUE(null, '');

Resultaat:

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

Null XPath

null opgeven als het tweede argument null teruggeeft :

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

Resultaat:

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

Slechts één argument geven

Het verstrekken van een enkel argument resulteert in een fout:

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

Resultaat:

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

Ontbrekend argument

EXTRACTVALUE() . aanroepen zonder het doorgeven van argumenten resulteert in een fout:

SELECT EXTRACTVALUE();

Resultaat:

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

Inleiding tot XML

Zie mijn XML-zelfstudie op Quackit voor meer informatie over XML. Die tutorial bevat ook een inleiding tot XPath.


  1. Hoe pg_stat_activity te gebruiken?

  2. Hoe MySQL-verbindingen (max_connections) vergroten?

  3. MySQL "NOT IN" query 3 tabellen

  4. Wat zijn macro's en hoe gebruik ik ze?