KingbaseES 原生XML系列三--XML数据查询函数

发布时间 2023-05-09 19:41:51作者: KINGBASE研究院

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 行记录)