sql >> Database >  >> RDS >> Mysql

MySQL XML-query's

Een oplossing voor uw probleem vereist het gebruik van een numbers tabel:een tabel met gehele getallen, 1,2,3,.... tot een redelijke waarde, zeg 1024.

Je gebruikt dan String Walking om het probleem op te lossen.

Hier is de CREATE TABLE-instructie voor de numbers tafel:

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;

Het bovenstaande wordt gevuld met waarden 1..1024

En nu de vraag:

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)

We gebruiken ExtractValue(@XML, 'count(/As/A/B)') om de waarde 3 te krijgen -- het aantal overeenkomende XML-elementen.

We doorlopen de nummers 1, 2, 3 en extraheren token #1, token #2, token #3 uit de tekst CHAN SHEY BOB , gesplitst op spatie.

Opmerkingen:

  • ExtractXML retourneert waarden met spaties gescheiden. Maar als er een spatie in de geretourneerde tekst is - niet doen. Het zou niet te onderscheiden zijn van de begrenzende ruimtes.

  • Het is mogelijk om het maken van de getallentabel en genereer de cijfers in een oogwenk . Ik raad het af -- het zou veel overhead veroorzaken. Het hebben van een tabel met 1024 rijennummers is altijd leuk om te hebben.

Veel succes!



  1. Duplicatie met SUM, LEFT JOIN en GROUP BY

  2. Waar/Onwaar versus 0/1 in MySQL

  3. Hoe SQL-query's te versnellen

  4. Formulier validatie