Mysql
 sql >> Base de Dados >  >> RDS >> Mysql

Consulta XML do MySQL


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!