Une solution à votre problème nécessiterait l'utilisation d'un numbers
table :une table d'entiers, 1,2,3,... jusqu'à une valeur raisonnable, disons 1024.
Vous utiliserez alors String Walking pour résoudre le problème.
Voici l'instruction CREATE TABLE pour les numbers
tableau :
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;
Ce qui précède est rempli avec les valeurs 1..1024
Et maintenant la requête :
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)
Nous utilisons ExtractValue(@XML, 'count(/As/A/B)')
pour obtenir la valeur 3 -- le nombre d'éléments XML correspondants.
En parcourant les numéros 1, 2, 3, nous extrayons le jeton #1, le jeton #2, le jeton #3 du texte CHAN SHEY BOB
, divisant par espace.
Remarques :
-
ExtractXML renvoie des valeurs délimitées par des espaces. Mais s'il y a un espace dans le texte renvoyé - pas de chance. Il serait indiscernable des espaces de délimitation.
-
Il est possible d'éviter de créer la table des nombres et générer les chiffres à la volée . Je déconseille - cela créerait beaucoup de frais généraux. Avoir une table de numéros de 1024 lignes est toujours agréable à avoir.
Bonne chance !