sql >> Databáze >  >> RDS >> Mysql

MySQL XML dotazování

Řešení vašeho problému by vyžadovalo použití numbers tabulka:tabulka celých čísel, 1,2,3,.... až po nějakou rozumnou hodnotu, řekněme 1024.

Potom byste použili String Walking k vyřešení problému.

Zde je příkaz CREATE TABLE pro numbers tabulka:

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;

Výše uvedené se naplní hodnotami 1..1024

A nyní dotaz:

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)

Používáme ExtractValue(@XML, 'count(/As/A/B)') získáte hodnotu 3 -- počet odpovídajících prvků XML.

Procházíme-li čísla 1, 2, 3, vyjmeme token #1, token #2, token #3 z textu CHAN SHEY BOB , rozdělení podle mezery.

Poznámky:

  • ExtractXML vrátí hodnoty oddělené mezerou. Ale pokud je ve vráceném textu mezera - nepokračujte. Bylo by to k nerozeznání od vymezujících mezer.

  • Je možné se vyhnout vytváření číselné tabulky a generujte čísla za běhu . Nedoporučuji - vytvořilo by to spoustu režie. Mít tabulku s čísly 1024 řádků je vždy příjemné.

Hodně štěstí!



  1. Jak vyřešit nemožnost přepnout chybu kódování při vkládání XML do SQL Serveru

  2. Soubory DSN a software IRI

  3. Můžete použít agregované hodnoty v rámci ON DUPLICATE KEY

  4. SQLite – import dat ze souboru CSV