Rozwiązanie twojego problemu wymagałoby użycia numbers
table:tabela liczb całkowitych, 1,2,3,.... do pewnej rozsądnej wartości, powiedzmy 1024.
Następnie użyjesz Chodzenie po ciągach aby rozwiązać problem.
Oto instrukcja CREATE TABLE dla numbers
tabela:
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;
Powyższe wypełnia się wartościami 1..1024
A teraz zapytanie:
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)
Używamy ExtractValue(@XML, 'count(/As/A/B)')
aby uzyskać wartość 3 -- liczba pasujących elementów XML.
Biegnąc przez cyfry 1, 2, 3, wyciągamy token #1, token #2, token #3 z tekstu CHAN SHEY BOB
, dzieląc spację.
Uwagi:
-
ExtractXML zwraca wartości rozdzielone spacjami. Ale jeśli w zwróconym tekście jest spacja - nie idź. Byłoby to nie do odróżnienia od oddzielających spacji.
-
Można uniknąć tworzenia tabeli liczb i generuj liczby w locie . Odradzam - spowodowałoby to duże obciążenie. Posiadanie tabeli liczb 1024 wierszy jest zawsze miłe.
Powodzenia!