Una soluzione al tuo problema richiederebbe l'utilizzo di un numbers
tabella:una tabella di numeri interi, 1,2,3,.... fino a un valore ragionevole, diciamo 1024.
Dovresti quindi utilizzare String Walking per risolvere il problema.
Ecco l'istruzione CREATE TABLE per i numbers
tabella:
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;
Quanto sopra viene popolato con i valori 1..1024
E ora la domanda:
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)
Usiamo ExtractValue(@XML, 'count(/As/A/B)')
per ottenere il valore 3 -- il numero di elementi XML corrispondenti.
Scorrendo i numeri 1, 2, 3, estraiamo il token n. 1, il token n. 2, il token n. 3 dal testo CHAN SHEY BOB
, suddividendo per spazio.
Note:
-
ExtractXML restituisce valori delimitati da spazi. Ma se c'è uno spazio all'interno del testo restituito, non andare. Sarebbe indistinguibile dagli spazi di delimitazione.
-
È possibile evitare di creare la tabella dei numeri e genera i numeri al volo . Sconsiglio:creerebbe molto sovraccarico. Avere una tabella di numeri di riga 1024 è sempre bello avere.
Buona fortuna!