Mysql
 sql >> Database >  >> RDS >> Mysql

Interrogazione XML MySQL

Una soluzione al tuo problema richiederebbe l'utilizzo di un numbers tabella:una tabella di numeri interi, 1,2,3,.... fino a un valore ragionevole, diciamo 1024.

Dovresti quindi utilizzare String Walking per risolvere il problema.

Ecco l'istruzione CREATE TABLE per i numbers tabella:

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;

Quanto sopra viene popolato con i valori 1..1024

E ora la domanda:

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)

Usiamo ExtractValue(@XML, 'count(/As/A/B)') per ottenere il valore 3 -- il numero di elementi XML corrispondenti.

Scorrendo i numeri 1, 2, 3, estraiamo il token n. 1, il token n. 2, il token n. 3 dal testo CHAN SHEY BOB , suddividendo per spazio.

Note:

  • ExtractXML restituisce valori delimitati da spazi. Ma se c'è uno spazio all'interno del testo restituito, non andare. Sarebbe indistinguibile dagli spazi di delimitazione.

  • È possibile evitare di creare la tabella dei numeri e genera i numeri al volo . Sconsiglio:creerebbe molto sovraccarico. Avere una tabella di numeri di riga 1024 è sempre bello avere.

Buona fortuna!