2016-11-26 42 views
0

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

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 

让我知道是否有实现这一目标最好的方式?

回答

1

我做到了通过分割列到两列

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'), ' ', ''))) 

OUTPUT

Value 

1 
2 
3 
4 
5 
7 
6 
8 
9 
11 
+0

感谢Rohan的回复,不幸的是上面的解决方案不会工作,因为结果节点可能是多个。 – Suresh

+0

@Suresh我已经更新了多个节点的查询。乐于帮助。如果此答案或任何其他人解决了您的问题,请将其标记为已接受。 –

+0

是Rohan更新的查询看起来不错,我尝试了另一个基于ExtractValue(v_order_xml,'count(// v_order_date)')循环的解决方案,并使用循环计数器变量逐行读取数据。无论如何接受你的答案。谢谢 – Suresh