En lösning på ditt problem skulle kräva användning av en numbers
tabell:en tabell med heltal, 1,2,3,.... upp till något rimligt värde, säg 1024.
Du skulle då använda String Walking för att lösa problemet.
Här är CREATE TABLE-satsen för numbers
tabell:
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;
Ovanstående fylls med värden 1..1024
Och nu frågan:
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 använder ExtractValue(@XML, 'count(/As/A/B)')
för att få värdet 3 -- antalet matchande XML-element.
Genom att gå igenom nummer 1, 2, 3 extraherar vi token #1, token #2, token #3 från texten CHAN SHEY BOB
, uppdelning efter mellanslag.
Anmärkningar:
-
ExtractXML returnerar värden mellanslagsavgränsade. Men om det finns ett mellanslag i den returnerade texten - no go. Det skulle inte kunna skiljas från de avgränsande utrymmena.
-
Det är möjligt att undvika att skapa siffertabellen och generera siffrorna i farten . Jag avråder från -- det skulle skapa en hel del omkostnader. Att ha en tabell med 1024 radnummer är alltid trevligt att ha.
Lycka till!