Solusi untuk masalah Anda memerlukan penggunaan numbers
table:tabel bilangan bulat, 1,2,3,.... hingga beberapa nilai yang masuk akal, katakanlah 1024.
Anda kemudian akan menggunakan String Walking untuk memecahkan masalah.
Berikut adalah pernyataan CREATE TABLE untuk numbers
tabel:
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;
Di atas diisi dengan nilai 1..1024
Dan sekarang pertanyaannya:
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)
Kami menggunakan ExtractValue(@XML, 'count(/As/A/B)')
untuk mendapatkan nilai 3 -- jumlah elemen XML yang cocok.
Menjalankan melalui nomor 1, 2, 3, kami mengekstrak token #1, token #2, token #3 dari teks CHAN SHEY BOB
, dipisah dengan spasi.
Catatan:
-
ExtractXML mengembalikan nilai yang dibatasi ruang. Tetapi jika ada spasi di dalam teks yang dikembalikan - jangan pergi. Itu tidak bisa dibedakan dari ruang pembatas.
-
Dimungkinkan untuk menghindari pembuatan tabel angka dan menghasilkan angka dengan cepat . Saya menyarankan untuk tidak -- itu akan membuat banyak overhead. Memiliki tabel nomor baris 1024 selalu menyenangkan untuk dimiliki.
Semoga berhasil!