Mysql
 sql >> Datenbank >  >> RDS >> Mysql

MySQL-XML-Abfrage

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üllt

Und 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!