Uma solução para o seu problema exigiria o uso de um
numbers
table:uma tabela de inteiros, 1,2,3,.... até algum valor razoável, digamos 1024. Você então usaria String Walking para resolver o problema.
Aqui está a instrução CREATE TABLE para os
numbers
tabela: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;
O acima é preenchido com valores 1..1024
E agora a 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 obter o valor 3 -- o número de elementos XML correspondentes. Percorrendo os números 1, 2, 3, extraímos o token #1, token #2, token #3 do texto
CHAN SHEY BOB
, dividindo por espaço. Notas:
-
ExtractXML retorna valores delimitados por espaço. Mas se houver um espaço no texto retornado - não vá. Seria indistinguível dos espaços delimitadores.
-
É possível evitar criar a tabela de números e gerar os números em tempo real . Eu desaconselho -- isso criaria muita sobrecarga. Ter uma tabela de números de 1024 linhas é sempre bom ter.
Boa sorte!