問題を解決するには、numbers
を使用する必要があります table:整数のテーブル、1、2、3、....妥当な値、たとえば1024まで。
次に、文字列ウォーキング を使用します。 問題を解決するために。
numbers
のCREATETABLEステートメントは次のとおりです。 テーブル:
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を実行して、テキストCHAN SHEY BOB
からトークン#1、トークン#2、トークン#3を抽出します。 、スペースで分割します。
注:
-
ExtractXMLは、スペースで区切られた値を返します。ただし、返されたテキスト内にスペースがある場合は、問題ありません。区切りスペースと見分けがつかないでしょう。
-
数値テーブルと
その場で番号を生成する 。私は反対することをお勧めします-それは多くのオーバーヘッドを生み出すでしょう。 1024行の数値テーブルがあると、いつでも便利です。
頑張ってください!