我想實作對 XML Element 的查詢,但找不到合適的方法來實作這一點。
讓我們考慮這張表:
CREATE TABLE SUBSCRIPTIONS(
SUBSCRIPTION_ID NUMBER,
PARAMETERS_XML CLOB
);
我的 XML 看起來像:
<Model>
<Parameters>
<Parameter>
<userParameter>outlets</userParameter>
<Values>
<Value>45</Value>
<Value>676</Value>
<Value>1502</Value>
...
</Values>
</Parameter>
</Parameters>
</Model>
我正在嘗試使用以下查詢從 XML、引數名稱和引數值中獲取每個訂閱:
SELECT
s.SUBSCRIPTION_ID,
s.PARAMETERS_XML,
xt.*
FROM EFNTA.SUBSCRIPTIONS s,
XMLTABLE(
'/Model/Parameters/Parameter'
PASSING XMLTYPE(s.PARAMETERS_XML)
COLUMNS USER_PARAM VARCHAR2(100) PATH 'userParameter',
PARAM_VALUE VARCHAR2(1000) PATH '//*:Values',
CHECKED_LIST_EXCLUDE VARCHAR2(100) PATH '//*:CheckedListExclude'
) xt ORDER BY 1 DESC;
問題是當有多個值時,結果作為一個大的串聯鏈回傳:

有沒有簡單的方法可以用逗號、分號或其他任何東西來分隔這些值?(我事先不知道值的數量)我找不到如何使用 XPath 實作這一點。
uj5u.com熱心網友回復:
您可以使用 FLOWR 重寫 XML 以,在每個Value元素中包含尾隨:
SELECT s.SUBSCRIPTION_ID,
s.PARAMETERS_XML,
xt.User_Param,
RTRIM(xt.Param_Value, ',') AS Param_Value,
xt.Checked_List_Exclude
FROM EFNTA.SUBSCRIPTIONS s
CROSS JOIN
XMLTABLE(
'copy $e := .
modify (
for $i in $e/Model/Parameters/Parameter/Values/Value
return replace node $i with <Value>{$i},</Value>
)
return $e/Model/Parameters/Parameter'
PASSING XMLTYPE(s.PARAMETERS_XML)
COLUMNS
USER_PARAM VARCHAR2(100) PATH 'userParameter',
PARAM_VALUE VARCHAR2(1000) PATH '//*:Values',
CHECKED_LIST_EXCLUDE VARCHAR2(100) PATH '//*:CheckedListExclude'
) xt
ORDER BY 1 DESC;
或者,正如
謝謝你的建議,我會把這一切都藏起來,以防萬一:-)
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/460768.html
