sql >> Base de Datos >  >> RDS >> Mysql

Consulta XML de MySQL

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!