Ce face ExtractValue()
ExtractValue() caută în XML elementele potrivite cu expresia XPath și returnează textul lor. Dacă se potrivesc mai multe elemente, textele sunt lipite, separate prin spațiu. Este returnat doar textul aflat direct în element, nu și cel al elementelor din interior.
Dacă nu se potrivește nimic, rezultatul este un text gol. Dacă XML-ul este invalid, rezultatul este NULL, cu avertisment; o expresie XPath greșită dă eroare. Se pot folosi atribute (/produs/@id), poziții (produs[2]), condiții (produs[pret>100]) și funcții ca count().
Parametri
| Parametru | Descriere |
|---|---|
xml |
Documentul XML (text). |
xpath |
Expresia XPath. |
Ce returnează
Un text (posibil gol) sau NULL pentru XML invalid.
Exemple
Exemplul 1: Elemente, atribute, poziții și count()
SET @xml = '<catalog><produs id="1"><nume>Laptop</nume><pret>3500</pret></produs><produs id="2"><nume>Mouse</nume><pret>80</pret></produs></catalog>';
SELECT ExtractValue(@xml, '/catalog/produs/nume') AS toate_numele,
ExtractValue(@xml, '/catalog/produs[2]/nume') AS al_doilea,
ExtractValue(@xml, '/catalog/produs[pret>100]/nume') AS scumpe,
ExtractValue(@xml, '/catalog/produs/@id') AS id_uri,
ExtractValue(@xml, 'count(/catalog/produs)') AS numar;
Rezultat
+--------------+-----------+--------+--------+-------+
| toate_numele | al_doilea | scumpe | id_uri | numar |
+--------------+-----------+--------+--------+-------+
| Laptop Mouse | Mouse | Laptop | 1 2 | 2 |
+--------------+-----------+--------+--------+-------+
Exemplul 2: Fără potrivire și XML invalid
SELECT ExtractValue('<a><b>1</b></a>', '/a/c') AS fara_potrivire,
ExtractValue('<a><b>1</b>', '/a/b') AS xml_invalid;
Rezultat
+----------------+-------------+
| fara_potrivire | xml_invalid |
+----------------+-------------+
| | NULL |
+----------------+-------------+
Warning (Code 1525): Incorrect XML value: 'parse error at line 1 pos 12: unexpected END-OF-INPUT'
Exemplul 3: Date dintr-o coloană XML
CREATE TABLE comenzi (id INT, detalii TEXT);
INSERT INTO comenzi VALUES
(1, '<comanda><client>Ana</client><oras>Iași</oras><total>350</total></comanda>'),
(2, '<comanda><client>Dan</client><oras>Cluj</oras><total>80</total></comanda>');
SELECT id,
ExtractValue(detalii, '/comanda/client') AS client,
ExtractValue(detalii, '/comanda/oras') AS oras,
ExtractValue(detalii, '/comanda/total') + 0 AS total
FROM comenzi;
Rezultat
+------+--------+-------+-------+
| id | client | oras | total |
+------+--------+-------+-------+
| 1 | Ana | Iași | 350 |
| 2 | Dan | Cluj | 80 |
+------+--------+-------+-------+
Greșeli frecvente
- Te aștepți la
NULLcând elementul lipsește. Primești un text gol; verifică cu= ''sau numără cucount(). - Extragi un element care conține alte elemente și te aștepți la tot textul din interior. Este returnat doar textul direct al elementului; scrie calea până la elementul dorit.
Comenzi înrudite
UpdateXML(): Înlocuiește în XML elementul găsit cu XPath cu un fragment nou și returnează documentul modificat.JSON_EXTRACT(): Citește o valoare dintr-un document JSON după o cale ca ‘$.adresa.strada’.ROLES_GRAPHML(): Returnează un document XML (GraphML) cu conturile, rolurile și legăturile dintre ele.