我做到了通過分割列到兩列
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
感謝Rohan的回覆,不幸的是上面的解決方案不會工作,因爲結果節點可能是多個。 – Suresh
@Suresh我已經更新了多個節點的查詢。樂於幫助。如果此答案或任何其他人解決了您的問題,請將其標記爲已接受。 –
是Rohan更新的查詢看起來不錯,我嘗試了另一個基於ExtractValue(v_order_xml,'count(// v_order_date)')循環的解決方案,並使用循環計數器變量逐行讀取數據。無論如何接受你的答案。謝謝 – Suresh