sql >> Databasteknik >  >> RDS >> Mysql

MySQL XML-förfrågan

En lösning på ditt problem skulle kräva användning av en numbers tabell:en tabell med heltal, 1,2,3,.... upp till något rimligt värde, säg 1024.

Du skulle då använda String Walking för att lösa problemet.

Här är CREATE TABLE-satsen för numbers tabell:

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;

Ovanstående fylls med värden 1..1024

Och nu frågan:

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)

Vi använder ExtractValue(@XML, 'count(/As/A/B)') för att få värdet 3 -- antalet matchande XML-element.

Genom att gå igenom nummer 1, 2, 3 extraherar vi token #1, token #2, token #3 från texten CHAN SHEY BOB , uppdelning efter mellanslag.

Anmärkningar:

  • ExtractXML returnerar värden mellanslagsavgränsade. Men om det finns ett mellanslag i den returnerade texten - no go. Det skulle inte kunna skiljas från de avgränsande utrymmena.

  • Det är möjligt att undvika att skapa siffertabellen och generera siffrorna i farten . Jag avråder från -- det skulle skapa en hel del omkostnader. Att ha en tabell med 1024 radnummer är alltid trevligt att ha.

Lycka till!



  1. Rails:Installerar PG gem på OS X - misslyckande med att bygga inbyggt tillägg

  2. Visa förälder-barn-relationen när förälder och barn är lagrade i samma tabell

  3. Hur skickar jag argument till ett PL/SQL-skript på kommandoraden med SQLPLUS?

  4. Oracle:flera tabelluppdateringar => ORA-01779:kan inte ändra en kolumn som mappas till en icke-nyckelbevarad tabell