Una solución a su problema requeriría el uso de un numbers
table:una tabla de enteros, 1,2,3,.... hasta un valor razonable, digamos 1024.
Entonces usaría String Walking para resolver el problema.
Aquí está la instrucción CREATE TABLE para los numbers
tabla:
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;
Lo anterior se completa con valores 1..1024
Y ahora la consulta:
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)
Usamos ExtractValue(@XML, 'count(/As/A/B)')
para obtener el valor 3 -- el número de elementos XML coincidentes.
Pasando por los números 1, 2, 3, extraemos el token #1, token #2, token #3 del texto CHAN SHEY BOB
, dividiendo por espacio.
Notas:
-
ExtractXML devuelve valores delimitados por espacios. Pero si hay un espacio dentro del texto devuelto, no lo haga. Sería indistinguible de los espacios delimitadores.
-
Es posible evitar crear la tabla de números y generar los números sobre la marcha . Lo desaconsejo:crearía muchos gastos generales. Siempre es bueno tener una tabla de números de 1024 filas.
¡Buena suerte!