使用SQL查询DB2 9中的XML数据

虽然 DB2 的混合体系结构与之前的版本有很大的不同,但是要利用它的新 XML 功能并不难。如果您已经熟悉 SQL,那么很快就可以将这方面的技能转化到对存储在 DB2 中的本地 XML 数据的处理上。通过本文就可以知道如何实现这一点。

DB2 Viper(就是DB2 9)中的 XML 特性包括新的存储管理、新的索引技术以及对查询语言的支持。在本文中,学习如何使用 SQL 或带 XML 扩展的 SQL(SQL/XML)查询 DB2 XML 列中的数据。接下来的文章将讨论 DB2 中新引入的对新兴的业界标准 XQuery 的支持,并探索 XQuery 在什么时候最有用。

您也许会感到惊讶,DB2 还支持双语查询 —— 即组合了来自 SQL 和 XQuery 的表达式的查询。至于应该使用哪种语言(或两种语言结合使用)取决于应用程序的需要,同时也取决于您本身所掌握的技能。其实,将两种查询语言中的元素组合到一个查询中并没有您想像的那么难。这样做还可以为搜索和集成传统 SQL 和 XML 数据提供强大的能力。

Sample 数据库

本文中的查询将访问在 “DB2 Viper 快速入门”(developerWorks,2006 年 4 月)中创建的 sample 数据库。这里我们简短地回顾一下,sample 数据库中 "items" 和 "clients" 表的定义:

清单 1. 表的定义

create table items (

id int primary key not null,

brandname varchar(30),

itemname varchar(30),

sku int,

srp decimal(7,2),

comments xml

)

create table clients(

id int primary key not null,

name varchar(50),

status varchar(10),

contactinfo xml

)

图 1 显示了 "items.comments" 列中的示例 XML 数据,图 2 显示了 "clients.contactinfo" 列中的示例 XML 数据。随后的查询例子将引用其中某个 XML 文档或这两个文档中某些特定的元素。

图 1. 存储在 "items" 表 "comments" 列的示例 XML 文档

图 2. 存储在 "clients" 表 "contactinfo" 列中的示例 XML 文档

查询环境

本文中的所有查询都是交互式地发出的,您可以通过 DB2 命令行处理器或 DB2 Control Center 中的 DB2 Command Editor 发出查询。本文中的屏幕图像和说明主要基于后一种方式。(DB2 Viper 还附带了一个基于 Eclipse 的 Developer Workbench,它可以帮助程序员图形化地构造查询。但是,本文不讨论应用开发问题或 Developer Workbench。)

要使用 DB2 Command Editor,需启动 Control Center 并选择 Tools > Command Editor。这时将弹出如 图 3 所示的窗口。在上面的面板中输入查询,单击左上角的绿色箭头运行查询,然后在下面的面板或 "Query results" 标签页中查看输出。

图 3. DB2 Command Editor,可以从 DB2 Control Center 启动

纯 SQL 查询

即使您对 SQL 所知有限,也仍然可以很轻松地查询 XML 数据。例如,下面的查询选择 "clients" 表中的全部内容,包括存储在 "contactinfo" 列的 XML 信息:

清单 2. 简单的 SELECT 语句

select * from clients

当然也可以编写更具选择性的 SQL 查询,使之包含关系投影和限制操作。下面的查询检索所有具有 "Gold" 状态的客户的 ID、姓名和联系方式。请注意,"contactinfo" 列包含 XML 数据,而其他两列不包含 XML 数据:

清单 3. 带投影和限制的简单 SELECT 语句

select id, name, contactinfo

from clients

where status = 'Gold'

正如您所预料,您可以基于这样的查询创建视图,下面的 "goldview" 可以说明这一点:

清单 4. 创建包含 XML 列的视图

create view goldview as

select id, name, contactinfo

from clients

where status = 'Gold'

不幸的是,很多事情光用 SQL 是无法解决的。通过纯 SQL 语句可以检索整个 XML 文档(刚才已证明这一点),但是却不能指定基于 XML 的查询谓词,也不能检索 XML 文档的某一部分或者 XML 文档中特定的元素值。换句话说,使用纯 SQL 不能对 XML 文档中的片段进行投影、限制、连接、聚集或排序操作。例如,您不能单独检索 Gold 客户的 email 地址或居住在邮政编码为 "95116" 的地区的客户的姓名。为了表达这些类型的查询,需要使用带 XML 扩展的 SQL(SQL/XML)、XQuery 或结合使用这两种查询语言。

时间: 2024-09-14 12:02:32

使用SQL查询DB2 9中的XML数据的相关文章

使用SQL查询DB2 9中的XML数据_DB2

正在看的db2教程是:使用SQL查询DB2 9中的XML数据. 虽然 DB2 的混合体系结构与之前的版本有很大的不同,但是要利用它的新 XML 功能并不难.如果您已经熟悉 SQL,那么很快就可以将这方面的技能转化到对存储在 DB2 中的本地 XML 数据的处理上.通过本文就可以知道如何实现这一点. DB2 Viper(就是DB2 9)中的 XML 特性包括新的存储管理.新的索引技术以及对查询语言的支持.在本文中,学习如何使用 SQL 或带 XML 扩展的 SQL(SQL/XML)查询 DB2 X

db2 连接数 sql查询-sql查询db2数据库连接

问题描述 sql查询db2数据库连接 小弟最近在做一个db2数据库的jdbc操作,期间需要用sql语句查询数据库的连接数,网上找了很久没找到,手头上没专业资料,还请知道的大哥大姐予以告知

sql查询同一表中不同ID的值

问题描述 sql查询同一表中不同ID的值 查询name为'xiaofengceshi'的不同aucid的最大now_price值(结果为两条,aucid为1和3) 解决方案 select max(now_price) from test_tb where name='xiaofengceshi' group by aucid

在SQL Server 2005中用XQuery分解XML数据

本文讨论SQL Server 2005的新功能,它允许你将XML数据分解到关系格式中,而不必耗用太多内存.我们首先了解一下XQuery和它在SQL Server 2005中为开发者提供的功能. XQuery介绍 XQuery,也称作XML Query,是一种查询XML数据的语言,允许你提取所需的节点和元素.它由W3C定义,可用于今天的大多数主流数据库引擎中,如Oracle.DB2和SQL Server. SQL Server 2005 XQuery函数 下面的四个函数是SQL Server 20

sql查询:如何用A组数据去查询另外一张表里的一个字段的数据并按A组数据的顺序排序

问题描述 sql查询:如何用A组数据去查询另外一张表里的一个字段的数据并按A组数据的顺序排序 我有这样的一组数据定为A:这个数据和我另一张表user_cards 中 grant_pid的数据是相等了,我想通过这组数据去查partner_id的数据并且按照A数据的这个顺序. 解决方案 select A.idB.id from A inner join B on A.id=B.id order by A.id 解决方案二: sql_查询一张表中的重复数据sql查询一张表的重复数据

HTML中的XML数据岛记录编辑与添加

xml|数据 <HTML>  <HEAD><Title>HTML中的数据岛中的记录集</Title></HEAD>  <body bkcolor=#EEEEEE text=blue bgcolor="#00FFFF">  <Table align=center width="100%"><TR><TD align="center">  &l

Java从zip文件中解析XML数据实例

从zip文件中解析xml文件一般步骤是先解压zip文件,然后在解析xml,这里直接从zip文件中读取xml的输入流进行解析,减少I/O操作.下面是一个从zip文件中解析xml文件的示例:    代码如下 复制代码 /**  * 从zip文件中解析XML数据<br/>  * @param filePath 文件绝对路径  * @return List<?>  * @throws IOException  * @throws DocumentException  * @author 大

sql 查询特殊不包括日期的数据

sql 查询特殊不包括日期的数据 sql ="select * from test where dates not in (#2010-05-03#,#2010-05-12#)" '日期格式要前后加必须加#号 '这样就可以查出不包括#2010-05-03#,#2010-05-12#的所有数据了,再看一个比较笨的方法 '方法二 sql = "select * from test where datediff('d',日期,'2010-05-03')<>0"

HTML中的XML数据岛记录编辑与添加_XML/RSS

<HTML><HEAD><Title>HTML中的数据岛中的记录集</Title></HEAD><body bkcolor=#EEEEEE text=blue bgcolor="#00FFFF"><Table align=center width="100%"><TR><TD align="center">   <h5><