DB2 Viper 原生支持 XQuery,查詢引擎本地解析、優化、執行 XQuery,無需轉譯為 SQL。XQuery 與 SQL 根本差異在於:XML 擁有層次與順序,關係表是無序集合;XQuery 支持路徑表達式導航樹結構,無 NULL 值(缺失即不存在),返回有序 XML 序列而非結果集。
CREATE TABLE items (id INT PRIMARY KEY, brandname VARCHAR(30), itemname VARCHAR(30), sku INT, srp DECIMAL(7,2), comments XML);
CREATE TABLE clients (id INT PRIMARY KEY, name VARCHAR(50), status VARCHAR(10), contactinfo XML);


使用 DB2 Control Center → Command Editor 交互執行查詢。

FLWOR 類比 SQL SELECT-FROM-WHERE:
for:迭代輸入序列,綁定變量let:聲明變量賦值where:過濾條件order by:排序return:構造結果路徑表達式:斜槓分隔的步驟,可帶謂詞過濾,如 $clients/Client/Address[state="CA"]/zip。
須以 xquery 關鍵字開頭。輸入源通過 db2-fn:xmlcolumn('TABLE.COLUMN') 獲取 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>4081112222</fax> ...。僅需文本值可加 text()。
Address 包含街道、城市、州、郵編等子元素:
xquery for $y in db2-fn:xmlcolumn('CLIENTS.CONTACTINFO')/Client/Address return $y
返回完整 <Address>... 片段序列。
查找郵編 95116 的地址:
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"]
多條件過濾(紐約 10011 或聖何塞任意郵編的郵箱):
xquery for $y in db2-fn:xmlcolumn('CLIENTS.CONTACTINFO')/Client
where $y/Address/zip="10011" or $y/Address/city="San Jose"
return $y/email
/* 路徑表達式 */
xquery db2-fn:xmlcolumn('CLIENTS.CONTACTINFO')/Client[Address/zip="10011" or Address/city="San Jose"]/email
注意:XQuery 無 NULL,缺失 email 的客戶不出現在結果中;多個 email 會攤平成扁平序列,失去文檔邊界。若需每客戶僅取首個 email:return $y/email[1]。
花括號 {...} 指示計算表達式而非字面量:
xquery <ul> {
for $y in db2-fn:xmlcolumn('CLIENTS.CONTACTINFO')/Client/Address
order by $y/zip
return <li>{$y}</li>
} </ul>
輸出可直接在瀏覽器渲染的 HTML 列表。
DB2 允許在 XQuery 中調用 db2-fn:sqlquery 執行 SQL,並將結果作為 XML 節點返回,實現關係與 XML 的深度融合。詳細示例參考後續文章。
XQuery 以原生方式釋放 XML 數據價值:路徑導航、FLWOR 迭代、條件過濾、排序、輸出構造一氣呵成。掌握其核心表達式,配合 DB2 原生優化引擎,即可高效實現複雜 XML 業務查詢。