使用动态XPATH在MySql中提取XML

时间:2016-12-28 14:11:00

标签: mysql xml xpath

我在旧数据库中有两个表。其中一个包含一个包含一些xml的字段。另一个表包含构成xml的标记。

例如,考虑一个包含语言列表的表格(例如enfrit)和一个包含

字段的表格
<en>Something</en><fr>Quelque chose</fr><it>Qualcosa</it>

我想提取所有翻译。我的查询类似于

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

但是我收到以下错误

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

我想这是MySql的限制(我使用版本5.6)。有没有其他方法可以获得我正在寻找的东西?

2 个答案:

答案 0 :(得分:0)

您可以尝试的一个选项是(根据需要调整):

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)

答案 1 :(得分:0)

我遇到了同样的问题,并在该博客文章http://sql-debug.blogspot.com/2012/05/extractvalue-only-constant-xpath.html

中找到了一个简单的解决方法

该解决方案确实令人惊讶,但是看起来很傻,但是效果很好...

它包含创建一个仅“包装” ExtractValue函数的函数,以便为其提供xpath作为已生成的字符串。

delimiter ##
create function exv(xml text, xpath text) returns text charset utf8 
begin 
return cast(extractvalue(xml, xpath) as char); 
end ##
delimiter ;

然后,在遇到[HY000] [1105]错误时,尝试在运行的查询中将 extractvalue 替换为 exv

当然,这种解决方法会降低性能……