Eine Lösung für Ihr Problem würde die Verwendung einer numbers
erfordern Tabelle:eine Tabelle mit ganzen Zahlen, 1,2,3,.... bis zu einem vernünftigen Wert, sagen wir 1024.
Sie würden dann String Walking verwenden um das Problem zu lösen.
Hier ist die CREATE TABLE-Anweisung für die numbers
Tabelle:
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;
Das Obige wird mit den Werten 1..1024
gefülltUnd jetzt die Abfrage:
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)
Wir verwenden ExtractValue(@XML, 'count(/As/A/B)')
um den Wert 3 zu erhalten -- die Anzahl der übereinstimmenden XML-Elemente.
Indem wir die Nummern 1, 2, 3 durchlaufen, extrahieren wir Token #1, Token #2, Token #3 aus dem Text CHAN SHEY BOB
, Aufteilung durch Leerzeichen.
Hinweise:
-
ExtractXML gibt durch Leerzeichen getrennte Werte zurück. Aber wenn der zurückgegebene Text ein Leerzeichen enthält, geht es nicht. Es wäre von den begrenzenden Leerzeichen nicht zu unterscheiden.
-
Es ist möglich, die Erstellung der Zahlentabelle und Generieren Sie die Zahlen im Handumdrehen . Ich rate davon ab – es würde viel Aufwand verursachen. Es ist immer schön, eine Tabelle mit 1024 Zeilennummern zu haben.
Viel Glück!