mysql - 从 MySQL 中的 XML 字符串中选择查询

标签 mysql xpath

我有一个具有多个子节点的 XML 字符串,我想从子节点获取数据,下面是一个示例结构,我想获取所有结果节点。尝试在 MySQL 中使用此查询

SET @xml= '<aaa><result>
        <id>1</id>
        </result>
        <result>
        <id>2</id>
        </result>
         ....
    </aaa>';
SELECT  ExtractValue(@xml, '/aaa/result/id/text()[1]');

电流输出

1 2

预期输出

1
2

请告诉我是否有实现此目标的最佳方法?

最佳答案

我通过将列分成两列来做到这一点

SET @xml= '<aaa><result>
        <id>1</id>
        </result>
        <result>
        <id>2</id>
        </result>
    </aaa>';

SELECT
        SUBSTRING_INDEX(ExtractValue(@xml, '//id'), ' ', 1) AS `id1`,
        SUBSTRING_INDEX(ExtractValue(@xml, '//id'), ' ', -1) AS `id2`

输出

id1   |    id2
1     |     2

正如您所说,结果节点可以是多个,为此我尝试了下面的查询

SET @xml= '<aaa><result>
        <id>1</id>
        </result>
        <result>
        <id>2</id>
        </result>
        <result>
        <id>3</id>
        </result>
        <result>
        <id>4</id>
        </result>
        <result>
        <id>5</id>
        </result>
        <result>
        <id>7</id>
        </result>
        <result>
        <id>6</id>
        </result>
        <result>
        <id>8</id>
        </result>
        <result>
        <id>9</id>
        </result>
        <result>
        <id>10</id>
        </result>
        <result>
        <id>11</id>
        </result>        
    </aaa>';

SELECT SUBSTRING_INDEX(SUBSTRING_INDEX(ExtractValue(@xml, '//id'), ' ', n.n), ' ', -1) value
  FROM (select SUBSTRING_INDEX(ExtractValue(@xml, '//id'), ' ', 1)) t CROSS JOIN 
  (
   SELECT a.N + b.N * 10 + 1 n
     FROM 
    (SELECT 0 AS N UNION ALL SELECT 1 UNION ALL SELECT 2 UNION ALL SELECT 3 UNION ALL SELECT 4 UNION ALL SELECT 5 UNION ALL SELECT 6 UNION ALL SELECT 7 UNION ALL SELECT 8 UNION ALL SELECT 9) a
   ,(SELECT 0 AS N UNION ALL SELECT 1 UNION ALL SELECT 2 UNION ALL SELECT 3 UNION ALL SELECT 4 UNION ALL SELECT 5 UNION ALL SELECT 6 UNION ALL SELECT 7 UNION ALL SELECT 8 UNION ALL SELECT 9) b
    ORDER BY n 
   ) n
 WHERE n.n <= 1 + (LENGTH(ExtractValue(@xml, '//id')) - LENGTH(REPLACE(ExtractValue(@xml, '//id'), ' ', '')))

输出

Value

1
2
3
4
5
7
6
8
9
11

关于mysql - 从 MySQL 中的 XML 字符串中选择查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40818406/

相关文章:

html - 为什么我的HTML输出中有xmlns

MySQL 检查结果是否被收藏

mysql - Rails 应用程序在 Heroku 中真的很慢

mysql - 在 where 子句中向 unix 时间戳添加天数?

xml - 是否有替代方法来控制基于另一组节点的一组节点的 XSLT 输出?

xml - 使用 XPath 获取/记录上下文节点的子节点

html - 使用HTML-TreeBuilder-XPath findnodes()方法逐一打印匹配结果时需要建议

mysql - 找不到有效的数据目录。 MySQL通用二进制安装

python - 显示带有用户输入的属性

r - 使用 Rselenium 在下拉框中选择选项