首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在MySQL中从XML字符串中选择查询

问在MySQL中从XML字符串中选择查询
EN

Stack Overflow用户
提问于 2016-11-26 12:39:19
回答 1查看 1.8K关注 0票数 0

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

代码语言:javascript
复制
SET @xml= '<aaa><result>
        <id>1</id>
        </result>
        <result>
        <id>2</id>
        </result>
         ....
    </aaa>';
SELECT  ExtractValue(@xml, '/aaa/result/id/text()[1]');

电流输出

代码语言:javascript
复制
1 2

预期输出

代码语言:javascript
复制
1
2

让我知道是否有最好的方法来实现这一点?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-11-26 13:06:04

我把这列分成两列。

代码语言:javascript
复制
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`

输出

代码语言:javascript
复制
id1   |    id2
1     |     2

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

代码语言:javascript
复制
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'), ' ', '')))

输出

代码语言:javascript
复制
Value

1
2
3
4
5
7
6
8
9
11
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/40818406

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档