En løsning på dit problem ville kræve brugen af et numbers
tabel:en tabel med heltal, 1,2,3,.... op til en rimelig værdi, f.eks. 1024.
Du ville derefter bruge String Walking for at løse problemet.
Her er CREATE TABLE-sætningen for numbers
tabel:
CREATE TABLE numbers (
`n` smallint unsigned NOT NULL AUTO_INCREMENT,
PRIMARY KEY (`n`)
)
;
INSERT INTO numbers VALUES (NULL);
INSERT INTO numbers SELECT NULL FROM numbers;
INSERT INTO numbers SELECT NULL FROM numbers;
INSERT INTO numbers SELECT NULL FROM numbers;
INSERT INTO numbers SELECT NULL FROM numbers;
INSERT INTO numbers SELECT NULL FROM numbers;
INSERT INTO numbers SELECT NULL FROM numbers;
INSERT INTO numbers SELECT NULL FROM numbers;
INSERT INTO numbers SELECT NULL FROM numbers;
INSERT INTO numbers SELECT NULL FROM numbers;
INSERT INTO numbers SELECT NULL FROM numbers;
Ovenstående udfyldes med værdierne 1..1024
Og nu forespørgslen:
SELECT
SUBSTRING_INDEX(SUBSTRING_INDEX(ExtractValue(@XML, '/As/A/B'), ' ', n), ' ', -1) AS value
FROM
numbers
WHERE
n BETWEEN 1 AND ExtractValue(@XML, 'count(/As/A/B)')
;
+-------+
| value |
+-------+
| Chan |
| Shey |
| Bob |
+-------+
3 rows in set (0.02 sec)
Vi bruger ExtractValue(@XML, 'count(/As/A/B)')
for at få værdien 3 -- antallet af matchende XML-elementer.
Ved at løbe gennem tallene 1, 2, 3 udtrækker vi token #1, token #2, token #3 fra teksten CHAN SHEY BOB
, opdeling efter mellemrum.
Bemærkninger:
-
ExtractXML returnerer værdier mellemrumssepareret. Men hvis der er et mellemrum i den returnerede tekst - så gå ikke. Det ville ikke kunne skelnes fra de afgrænsende rum.
-
Det er muligt at undgå at oprette taltabellen og generer tallene i farten . Jeg fraråder -- det ville skabe en masse overhead. At have en tabel med 1024 rækkenumre er altid rart at have.
Held og lykke!