我在旧数据库中有两个表。其中一个包含一个包含一些xml的字段。另一个表包含构成xml的标记。
例如,考虑一个包含语言列表的表格(例如en
,fr
,it
)和一个包含
<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)。有没有其他方法可以获得我正在寻找的东西?
答案 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 。
当然,这种解决方法会降低性能……