2016-12-28 1 views
1

Ich habe zwei Tabellen in einer Legacy-Datenbank. Einer von ihnen enthält ein Feld, das einige XML enthält. Diese andere Tabelle enthält die Tags, die das XML bilden.Extrahiere XML in MySql mit dynamischem XPATH

Zum Beispiel einer Tabelle mit einer Liste von Sprachen (z en, fr, it) und eine Tabelle mit einem Feld wie

<en>Something</en><fr>Quelque chose</fr><it>Qualcosa</it> 

ich alle Übersetzungen extrahieren möchte. Ich habe eine Abfrage, die

SELECT GROUP_CONCAT(extractvalue(table.field, languages.sigla)) 
FROM table, languages 
GROUP BY table.id 

Aber ich bekomme die folgenden Fehler

[HY000][1105] Only constant XPATH queries are supported 

Ich denke, dies ist eine Beschränkung von MySql (ich bin usign Version 5.6) wie

geht. Gibt es einen anderen Weg, um zu bekommen, wonach ich suche?

Antwort

0

Eine Option, die Sie versuchen können, ist (nach Bedarf anpassen):

mysql> SELECT 
    ->  GROUP_CONCAT('SELECT ExtractValue(@`xml`, \'', `der`.`lang`, '\') `lang`' SEPARATOR ' UNION ALL ') INTO @`query` 
    -> FROM (
    ->  SELECT 'en' `lang` 
    ->  UNION 
    ->  SELECT 'fr' 
    ->  UNION 
    ->  SELECT 'it' 
    ->) `der`; 
Query OK, 1 row affected (0.00 sec) 

mysql> SET @`xml` := '<en>Something</en><fr>Quelque chose</fr><it>Qualcosa</it>'; 
Query OK, 0 rows affected (0.00 sec) 

mysql> SET @`query` := CONCAT('SELECT GROUP_CONCAT(`der`.`lang`) 
    '>       FROM (', @`query`, ') `der`'); 
Query OK, 0 rows affected (0.00 sec) 

mysql> PREPARE `stmt` FROM @`query`; 
Query OK, 0 rows affected (0.00 sec) 
Statement prepared 

mysql> EXECUTE `stmt`; 
+----------------------------------+ 
| GROUP_CONCAT(`der`.`lang`)  | 
+----------------------------------+ 
| Something,Quelque chose,Qualcosa | 
+----------------------------------+ 
1 row in set (0.00 sec) 

mysql> DEALLOCATE PREPARE `stmt`; 
Query OK, 0 rows affected (0.00 sec)