Mysql
 sql >> Base de données >  >> RDS >> Mysql

Interrogation XML MySQL

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 !