2016-11-26 54 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