Een oplossing voor uw probleem vereist het gebruik van een numbers
tabel:een tabel met gehele getallen, 1,2,3,.... tot een redelijke waarde, zeg 1024.
Je gebruikt dan String Walking om het probleem op te lossen.
Hier is de CREATE TABLE-instructie voor de numbers
tafel:
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;
Het bovenstaande wordt gevuld met waarden 1..1024
En nu de vraag:
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)
We gebruiken ExtractValue(@XML, 'count(/As/A/B)')
om de waarde 3 te krijgen -- het aantal overeenkomende XML-elementen.
We doorlopen de nummers 1, 2, 3 en extraheren token #1, token #2, token #3 uit de tekst CHAN SHEY BOB
, gesplitst op spatie.
Opmerkingen:
-
ExtractXML retourneert waarden met spaties gescheiden. Maar als er een spatie in de geretourneerde tekst is - niet doen. Het zou niet te onderscheiden zijn van de begrenzende ruimtes.
-
Het is mogelijk om het maken van de getallentabel en genereer de cijfers in een oogwenk . Ik raad het af -- het zou veel overhead veroorzaken. Het hebben van een tabel met 1024 rijennummers is altijd leuk om te hebben.
Veel succes!