Giải pháp cho vấn đề của bạn sẽ yêu cầu sử dụng numbers
table:một bảng các số nguyên, 1,2,3, .... lên đến một giá trị hợp lý nào đó, chẳng hạn như 1024.
Sau đó, bạn sẽ sử dụng Đi bộ theo chuỗi để giải quyết vấn đề.
Đây là câu lệnh CREATE TABLE cho các số numbers
bảng:
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;
Ở trên điền các giá trị 1..1024
Và bây giờ là truy vấn:
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)
Chúng tôi sử dụng ExtractValue(@XML, 'count(/As/A/B)')
để nhận giá trị 3 - số lượng các phần tử XML phù hợp.
Chạy qua các số 1, 2, 3, chúng tôi trích xuất mã thông báo số 1, mã thông báo số 2, mã thông báo số 3 từ văn bản CHAN SHEY BOB
, chia tách theo không gian.
Ghi chú:
-
ExtractXML trả về các giá trị được phân cách bằng không gian. Nhưng nếu có một khoảng trống trong văn bản được trả về - không được. Nó sẽ không thể phân biệt được với các khoảng cách phân định.
-
Có thể tránh tạo bảng số và tạo các con số một cách nhanh chóng . Tôi khuyên không nên - nó sẽ tạo ra rất nhiều chi phí. Luôn có một bảng số 1024 hàng.
Chúc các bạn thành công!