Ř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í!