Решението на вашия проблем ще изисква използването на numbers
таблица:таблица с цели числа, 1,2,3,.... до някаква разумна стойност, да речем 1024.
След това бихте използвали String Walking за решаване на проблема.
Ето оператора CREATE TABLE за numbers
таблица:
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;
Горното се попълва със стойности 1..1024
И сега заявката:
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)
Използваме ExtractValue(@XML, 'count(/As/A/B)')
за да получите стойността 3 -- броя на съответстващите XML елементи.
Преминавайки през числа 1, 2, 3, извличаме символ #1, символ #2, символ #3 от текста CHAN SHEY BOB
, разделяне на интервал.
Бележки:
-
ExtractXML връща стойности, разделени с пространство. Но ако има интервал във върнатия текст - не тръгвайте. Би било неразличимо от разделителните пространства.
-
Възможно е да се избегне създаването на таблица с числа и генерирайте числата в движение . Не съветвам - това ще създаде много режийни разходи. Винаги е хубаво да имаш таблица с числа от 1024 реда.
Успех!