KingbaseES 原生XML系列三--XML数据查询函数
KingbaseES 原生XML系列三--XML数据查询函数(EXTRACT,EXTRACTVALUE,EXISTSNODE,XPATH,XPATH_EXISTS,XMLEXISTS)
XML的简单使其易于在任何应用程序中读写数据,这使XML很快成为数据交换的一种公共语言。在不同平台下产生的信息,可以很容易加载XML数据到程序中并分析他,并以XML格式输出结果。
xml数据类型可以被用来存储XML数据。它比直接在一个text域中存储XML数据的优势在于,它会检查输入值的结构是不是良好,并且有支持函数用于在其上执行类型安全的操作。
本文详细介绍了KingbaseES中集成的相关xml数据查询函数使用。
准备数据:
CREATE TABLE "public"."xmldata" (
"id" integer NULL,
"comm" varchar NULL,
"xmlvarchar" varchar NULL,
"xmldata" xml NULL,
"XMLarray" xml NULL
);
INSERT INTO xmldata values(1, 'zhangsan' , '<kes>aaa</kes>' , '<kes><sql>sql001</sql><rac>rac001</rac></kes>' , '<kes><version>v8r3001</version><version>v8r6001</version></kes>');
INSERT INTO xmldata values(2, 'lisi' , '<kes>bbb</kes>' , '<kes><sql>sql002</sql><rac>rac002</rac></kes>' , '<kes><version>v8r3002</version><version>v8r6002</version></kes>');
INSERT INTO xmldata values(3, 'wangwu' , '<kes>ccc</kes>' , '<kes><sql>sql003</sql><rac>rac003</rac></kes>' , '<kes><version>v8r3003</version><version>v8r6003</version></kes>');
xml函数列表
json函数简介
EXTRACT
功能:
extract会返回
xpath
指定的节点的xml数据。
用法:
extract(xml_instance xml, xpath text)
示例:
test=# select extract(xmlarray , '/kes/version' ) ,xmlarray from xmldata ;
extract | xmlarray
------------------------------------------------------+-----------------------------------------------------------------
<version>v8r3001</version><version>v8r6001</version> | <kes><version>v8r3001</version><version>v8r6001</version></kes>
<version>v8r3002</version><version>v8r6002</version> | <kes><version>v8r3002</version><version>v8r6002</version></kes>
<version>v8r3003</version><version>v8r6003</version> | <kes><version>v8r3003</version><version>v8r6003</version></kes>
(3 行记录)
test=# select extract(xmldata , '/kes/sql' ) ,xmldata from xmldata ;
extract | xmldata
-------------------+-----------------------------------------------
<sql>sql001</sql> | <kes><sql>sql001</sql><rac>rac001</rac></kes>
<sql>sql002</sql> | <kes><sql>sql002</sql><rac>rac002</rac></kes>
<sql>sql003</sql> | <kes><sql>sql003</sql><rac>rac003</rac></kes>
(3 行记录)
-- 获取节点属性值
test=# select extract('<kes><sql version="v8r6c7">sql001</sql><rac>rac001</rac></kes>','/kes/sql/@version') ;
extract
---------
v8r6c7
(1 行记录)
EXTRACTVALUE
功能:
函数extractvalue会返回
xpath
指定的节点的值。如果节点的值是另一个节点,则不可获取,若指定节点路径存在多个相同节点,则会报错,也可通过数组形式,如:'/a/b[1]'指定返回具体节点。
用法:
extractvalue(xml_instance xml, xpath text)
extractvalue(xml_instance xml, xpath text, namespace _text)
示例:
test=# select extractvalue(xmldata , '/kes/sql' ) ,xmldata from xmldata ;
extractvalue | xmldata
--------------+-----------------------------------------------
sql001 | <kes><sql>sql001</sql><rac>rac001</rac></kes>
sql002 | <kes><sql>sql002</sql><rac>rac002</rac></kes>
sql003 | <kes><sql>sql003</sql><rac>rac003</rac></kes>
(3 行记录)
-- 多个值时,报错。
test=# select extractvalue(xmlarray , '/kes/version' ) ,xmlarray from xmldata ;
错误: EXTRACTVALUE returns value of only one node
-- 多个值时,获取某个值
test=# select extractvalue(xmlarray , '/kes/version[1]' ) ,xmlarray from xmldata ;
extractvalue | xmlarray
--------------+-----------------------------------------------------------------
v8r3001 | <kes><version>v8r3001</version><version>v8r6001</version></kes>
v8r3002 | <kes><version>v8r3002</version><version>v8r6002</version></kes>
v8r3003 | <kes><version>v8r3003</version><version>v8r6003</version></kes>
(3 行记录)
EXISTSNODE
功能:
XML函数existsnode会遍历
xml
实例,判断指定节点是否存在于实例中。若存在则返回1,不存在则返回0。
用法:
existsnode(text PASSING [BY { REF | VALUE }] xml [BY { REF | VALUE }])
existsnode(xml_instance xml, xpath text)
示例:
test=# select existsnode(xmldata , '/kes/sql'), existsnode(xmlarray,'/kes/version'), existsnode(xmldata , '/kes/noitem'), xmldata from xmldata ;
existsnode | existsnode | existsnode | xmldata
------------+------------+------------+-----------------------------------------------
1 | 1 | 0 | <kes><sql>sql001</sql><rac>rac001</rac></kes>
1 | 1 | 0 | <kes><sql>sql002</sql><rac>rac002</rac></kes>
1 | 1 | 0 | <kes><sql>sql003</sql><rac>rac003</rac></kes>
(3 行记录)
XPATH
功能:
函数xpath在 XML 值
xml
上计算 XPath 1.0 表达式 xpath (a text value)。它返回一个 XML 值的数组,该数组对应于该 XPath 表达式产生的结点集合。
用法:
xpath(xpath, xml [, nsarray])
示例:
test=# select xpath('/kes/*' , xmldata) from xmldata ;
xpath
---------------------------------------
{<sql>sql001</sql>,<rac>rac001</rac>}
{<sql>sql002</sql>,<rac>rac002</rac>}
{<sql>sql003</sql>,<rac>rac003</rac>}
(3 行记录)
XPATH_EXISTS
功能:
函数xpath_exists是xpath函数的一种特殊形式。它返回一个布尔值表示查询是否被满足
用法:
xpath_exists(xpath, xml [, nsarray])
示例:
test=# select xpath('/kes/sql' , xmldata) , xpath('/kes/no' , xmldata) from xmldata ;
xpath | xpath
---------------------+-------
{<sql>sql001</sql>} | {}
{<sql>sql002</sql>} | {}
{<sql>sql003</sql>} | {}
(3 行记录)
XMLEXISTS
功能:
XMLExists检查给定 XQuery 表达式是否返回非空 XQuery 序列。
用法:
XMLEXISTS(XQuery_string [XML_passing_clause])
XML_passing_clause:
PASSING [BY VALUE ] expr [AS identifier] [, ... ]
示例:
test=# SELECT xmlexists('/kes[text() = ''aaa'']' PASSING BY VALUE xmlvarchar) ,xmlvarchar from xmldata ;
xmlexists | xmlvarchar
-----------+----------------
t | <kes>aaa</kes>
f | <kes>bbb</kes>
f | <kes>ccc</kes>
(3 行记录)
test=# SELECT xmlexists('/kes/sql' PASSING BY VALUE xmldata) ,xmldata from xmldata;
xmlexists | xmldata
-----------+-----------------------------------------------
t | <kes><sql>sql001</sql><rac>rac001</rac></kes>
t | <kes><sql>sql002</sql><rac>rac002</rac></kes>
t | <kes><sql>sql003</sql><rac>rac003</rac></kes>
(3 行记录)
KINGBASE研究院
分类:
SQL
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· Docker 太简单,K8s 太复杂?w7panel 让容器管理更轻松!