/Client/Address ≠ /client/address。| 表達式 | 用途 | 對應 SQL 概念 |
|---|---|---|
| Path Expression (路徑表達式) | 在 XML 階層導航、過濾、取值 | WHERE 條件 + 選取欄位 |
| FLWOR Expression | 迭代、過濾、排序、建構輸出 | SELECT-FROM-WHERE-ORDER BY |
<Client id="123">
<Address><street>9999 Elm St.</street><city>San Jose</city><state>CA</state><zip>95141</zip></Address>
<email>any@yahoo.com</email><email>another@yahoo.com</email>
</Client>
| 表達式 | 結果 |
|---|---|
/Client/email | 所有 email 元素 |
/Client/email[1] | 第一個 email 元素 |
/Client[@id='123']/email[1] | id=123 的 Client 第一個 email |
/Client/Address[state="CA"]/zip | 州=CA 的 zip 元素 |
/Client/*/city | Client 任一直接子元素下的 city |
/Client/Address/city | 精確導航到 city |
//email | 文件任意深度的 email |
/Client/email[1]/text() | 第一個 email 的文本值 |
/Client/data(@id) | id 屬性值 "123" |
/Client/Address[state="CA"]/../email | 州=CA 的 Client 所有 email (.. 返回父節點) |
for $i in (1,2,3) return $i → 1 2 3 (逐項綁定)
let $i := (1,2,3) return → (整體綁定)
for $i in (1,2,3) where $i < 3 return $i → 1 2 (過濾)
for $i in (5,1,2,3) order by $i descending return $i → 5 3 2 1 (排序)
ascending/descending、empty greatest/least。xquery 表達式 (關鍵字 xquery 告知剖析器)。xquery 前綴,直接用 XMLQUERY/XMLEXISTS。clients:id, name, status, contactinfo XML。db2 -i -d:輸出縮排格式化 XML,易讀不影響實際資料。xquery db2-fn:xmlcolumn('CLIENTS.CONTACTINFO')
xquery for $y in db2-fn:xmlcolumn('CLIENTS.CONTACTINFO')/Client/fax return $y
-- 等價路徑表達式
xquery db2-fn:xmlcolumn('CLIENTS.CONTACTINFO')/Client/fax
輸出:<fax>4087776666</fax> <fax>4085555555</fax>
xquery db2-fn:xmlcolumn('CLIENTS.CONTACTINFO')/Client/fax/text()
輸出:4087776666 4085555555
xquery db2-fn:xmlcolumn('CLIENTS.CONTACTINFO')/Client/Address
xquery for $y in db2-fn:xmlcolumn('CLIENTS.CONTACTINFO')/Client/Address
where $y/zip = "95116"
return $y
-- 等價路徑謂詞
xquery db2-fn:xmlcolumn('CLIENTS.CONTACTINFO')/Client/Address[zip="95116"]
xquery for $y in db2-fn:xmlcolumn('CLIENTS.CONTACTINFO')/Client
where $y/Address/zip="95032" or $y/Address/city="San Jose"
return $y/email
-- 路徑表達式版
xquery db2-fn:xmlcolumn('CLIENTS.CONTACTINFO')/Client[Address/zip="95032" or Address/city="San Jose"]/email
輸出 3 筆 email (兩筆屬同一 Client)。
xquery db2-fn:xmlcolumn('CLIENTS.CONTACTINFO')/Client[Address/zip="95032" or Address/city="San Jose"]/email[1]
xquery
{
for $y in db2-fn:xmlcolumn('CLIENTS.CONTACTINFO')/Client/Address
order by $y/zip
return - {$y}
}
{...} 大括號指示「計算運算式」而非字串字面值。
xquery for $y in db2-fn:xmlcolumn('CLIENTS.CONTACTINFO')/Client
where $y/Address[zip="95032"] or $y/Address[city="San Jose"]
return {$y/email}
輸出:有 email 者含 <email>...、無 email 者輸出 <emailList/>、多 email 者全部保留,完美保留文件邊界語意。
xquery for $y in db2-fn:xmlcolumn('CLIENTS.CONTACTINFO')/Client
return (
if ($y/email) then $y/email[1]
else if ($y/phone/home) then {$y/phone/home/text()}
else $y/Address
)
確保每位客戶恰好回傳一種聯絡資訊。
SELECT name, status,
XMLQUERY('$c/Client/phone/home' PASSING contactinfo AS "c")
FROM clients
WHERE XMLEXISTS('$y/Client/Address[zip="95032"]' PASSING contactinfo AS "y");
XMLQUERY:從 XML 擷取片段放入 SQL 結果集欄位。XMLEXISTS:在 WHERE 子句中依 XML 條件過濾列。$c, $y 綁定 contactinfo 欄位。結果:Lisa Hansen | Silver | <home>4083332222</home>
xquery for $y in
db2-fn:sqlquery("SELECT contactinfo FROM clients WHERE status='Gold'")/Client
where $y/Address/city="San Jose"
return (
if ($y/email) then {$y/email}
else $y/Address
)
db2-fn:sqlquery 執行 SQL 並回傳 XML 序列供 XQuery 後續處理。''Gold''。輸出:Gold 客戶住 San Jose 者,有 email 則包裝 <emailList>,無 email 則回傳 Address。
xquery 前綴、db2-fn:xmlcolumn、db2-fn:sqlquery。XMLQUERY/XMLEXISTS (SQL 主) vs db2-fn:sqlquery (XQuery 主)。