sql 查询xml数据

尽管DB2的混合体系结构与以前的版本相比有很大的不同,但是利用其新的XML功能并不一定是一个痛苦的过程。 如果您已经熟悉SQL,则可以立即将您的技能应用于处理本机存储在DB2中的XML数据。 参见本文内容。

DB2 9中的XML功能包括新的存储管理,索引和查询语言支持。 在本文中,学习如何使用SQL或带有XML扩展SQL(SQL / XML)查询DB2 XML列中的数据。 该系列的下一篇文章将讨论DB2对XQuery(一种新兴的行业标准)的新支持,并探讨它何时最有用。

您可能会惊讶地发现DB2还支持双语查询-即结合了SQL和XQuery表达式的查询。 您应使用哪种语言(或多种语言的组合)取决于您的应用程序需求以及您的技能。 将两种查询语言的元素组合成一个查询并不像您想象的那样困难。 这样做可以为您提供强大的功能,以搜索和集成传统SQL和XML数据。

样本数据库

本文中的查询将访问“ 快速入门DB2 9,第2部分 ”(developerWorks,2006年3月)中创建的示例表。 作为快速回顾,样本“项目”和“客户”表的定义如下:

清单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
)

清单2中显示了“ items.comments”列中包含的示例XML数据, 清单3中显示了“ clients.contactinfo”列中包含的示例XML数据。 后续查询示例将引用这些XML文档之一或全部中的特定元素。

清单2.存储在“ items”表的“ comments”列中的示例XML文档
<Comments>
	<Comment>
		<CommentID>133</CommentID>
		<ProductID>3926</ProductID>
		<CustomerID>8877</CustomerID>
		<Message>Heels on shoes wear out too quickly.</Message>
		<ResponseRequested>No</ResponseRequested>
	</Comment>
	<Comment>
		<CommentID>514</CommentID>
		<ProductID>3926</ProductID>
		<CustomerID>3227</CustomerID>
		<Message>Where can I find a supplier in San Jose?</Message>
		<ResponseRequested>Yes</ResponseRequested>
	</Comment>
</Comments>
清单3. XML文档样本存储在“ clients”表的“ contactinfo”列中
<Client>
	<Address>
		<street>5401 Julio Ave.</street>
		<city>San Jose</city>
		<state>CA</state>
		<zip>95116</zip>
	</Address>
	<phone>
		<work>4084630000</work>
		<home>4081111111</home>
		<cell>4082222222</cell>
	</phone>
	<fax>4087776666</fax>
	<email>love2shop@yahoo.com</email>
</Cleint>

查询环境

本文中的所有查询均设计为以交互方式发出,您可以通过DB2命令行处理器或DB2 Control Center的DB2 Command Editor来执行。 本文中的屏幕图像和说明主要针对后者。 (IBM Data Studio和IBM Optim Development Studio还附带了一个基于Eclipse的Developer Workbench,它可以帮助程序员以图形方式构造查询。但是,本文不讨论应用程序开发问题或Development Studio。)

要使用DB2命令编辑器,请启动控制中心,然后选择工具 > 命令编辑器 。 将会出现类似于图1的窗口。 在上部窗格中键入查询,单击左上角的绿色箭头以运行它们,然后在下部窗格或单独的“查询结果”选项卡中查看输出。

图1. DB2命令编辑器,可以从DB2控制中心启动
上方窗格显示简单SQL查询。下部窗格显示查询成功。

仅SQL查询

即使您对SQL的了解有限,您仍然可以轻松查询XML数据。 例如,以下查询选择“客户端”表的完整内容,包括存储在“ contactinfo”列中的XML信息:

清单4.简单的SELECT语句
select * from clients

当然,您可以编写包含关系投影和限制操作的更具选择性SQL查询。 以下查询检索所有状态为“金”的客户的ID,名称和联系信息。 请注意,“ contactinfo”包含XML数据,而其他两列则不包含:

清单5.具有投影和约束的简单SELECT语句
select id, name, contactinfo 
from clients
where status = 'Gold'

而且,正如您可能期望的那样,您可以基于此类查询创建视图,如此处的“ goldview”所示:

清单6.创建一个包含XML列的视图
create view goldview as 
select id, name, contactinfo 
from clients
where status = 'Gold'

不幸的是,有很多您不能仅使用SQL来完成。 普通SQL语句使您能够检索完整的XML文档(如您所见),但是您无法指定基于XML的查询谓词,也无法从XML文档中检索部分XML文档或特定元素值。 换句话说,您不能使用纯SQL通过XML文档的片段来投影,限制,联接,聚集或排序。 例如,您不能仅检索Gold客户的电子邮件地址或邮政编码为“ 95116”的客户的姓名。 要表达这些类型的查询,您需要使用带有XML扩展(SQL / XML),XQuery或两者结合SQL。

下一节将探讨SQL / XML的一些基本功能。 在随后的文章中,将学习如何编写XQuery以及如何将XQuery与SQL结合。

SQL / XML查询

顾名思义,SQL / XML旨在在SQL和XML世界之间架起桥梁。 它是SQL标准工作的一部分,现在包括在SQL语句中嵌入XQuery或XPath表达式的规范。 XPath是一种用于浏览XML文档以查找元素或属性的语言。 XQuery包括对XPath的支持。

请务必注意,XQuery(和XPath)表达式区分大小写。 例如,引用XML元素“ zip”的XQuery不适用于名为“ ZIP”或“ Zip”的XML元素。 对于SQL程序员来说,有时很难记住区分大小写,因为SQL查询语法允许他们使用“ zip”,“ ZIP”和“ Zip”来引用相同的列名。

DB2 9具有超过15种SQL / XML功能,使您可以搜索XML文档中的特定数据,将关系数据转换为XML,将XML数据转换为关系数据以及执行其他有用的任务。 本文没有涵盖SQL / XML的全部范围。 但是,它回顾了几个常见的查询挑战以及关键SQL / XML函数如何解决这些挑战。

基于XML元素值的“限制”结果

SQL程序员经常编写查询,这些查询根据某些条件限制从DBMS返回的行。 例如, 清单5中SQL查询将从“客户”表中检索到的行限制为仅包括那些状态为“金”的客户。 在这种情况下,将在SQL VARCHAR列中捕获客户的状态。 但是,如果您想根据适用于XML列中数据的某些条件来限制搜索,该怎么办? SQL / XML的XMLExists函数提供了一种实现此目的的方法。

XMLExists使您可以导航到XML文档中的元素并测试特定条件。 当指定为WHERE子句的一部分时, XMLExists返回的结果限制为仅包含具有特定XML元素值(换言之,指定值的值为“ true”)的XML文档的那些行。

让我们看一下先前提出的示例查询问题。 假设您需要查找居住在特定邮政编码中的所有客户端的名称。 您可能还记得,“客户”表在XML列中存储客户地址(包括邮政编码)。 (请参见清单3。 )使用XMLExists ,可以在XML列中搜索目标邮政编码,并相应地限制返回的结果集。 以下SQL / XML查询返回邮政编码为95116的客户端的名称:

清单7.基于XML元素值限制结果
select name from clients
where xmlexists('$c/Client/Address[zip="95116"]'
passing clients.contactinfo as "c")

第一行是一个SQL子句,指定您只想检索“客户”表的“名称”列中的信息。 WHERE子句调用XMLExists函数,并指定一个XPath表达式来提示DB2导航到“ zip”元素并检查值95116。“ $ c / Client / Address”子句指示XML文档层次结构中的路径,其中DB2可以找到“ zip”元素。 使用从节点“ $ c”(我们将稍后解释)访问的数据,DB2将在“ Client”元素中导航至其“ Address”子元素,以检查邮政编码(“ zip”值)。 最后一行解析“ $ c”的值:它是“ clients”表的“ contactinfo”列。 因此,DB2检查“ contactinfo”列中包含的XML数据,从根“ Client”元素导航到“ Address”,然后导航到“ zip”,并确定客户是否居住在目标邮政编码中。 如果是这样,则XMLExists函数的计算结果为“ true”,并且DB2返回与该行关联的客户机的名称。

常见的错误涉及制定XMLExists查询谓词,如清单8所示。

清单8.用于基于XML元素值限制结果的错误语法
select name from clients
where xmlexists('$c/Client/Address/zip="95116" '
passing clients.contactinfo as "c")

尽管此查询将成功执行,但不会将结果限制为邮政编码为95116的客户端。(这是由于标准中指定的语义所致;它不是DB2独有的。)将结果限制为邮政编码为95116的客户端。 ,您需要使用清单7前面显示的语法。

您可能很好奇如何在应用程序中包含限制XML数据的查询。 尽管本文没有详细讨论应用程序开发主题,但它包含一个简单的Java示例 ,该示例在SQL / XML语句中使用参数标记将输出限制为有关居住在给定邮政编码中的客户的信息。

“投影” XML元素值

现在,让我们考虑一种稍微不同的情况,在这种情况下,您要将XML值投影到返回的结果集中。 换句话说,我们想要从XML文档中检索一个或多个元素值。 有多种方法可以做到这一点。 首先,我们使用XMLQuery函数来检索一个元素的值,然后使用XMLTable函数来检索多个元素的值并将它们映射到SQL结果集的列中。

让我们考虑如何解决前面提出的问题:如何创建一个列出Gold客户的电子邮件地址的报告。 清单9中的以下查询调用XMLQuery函数来完成此任务:

清单9.检索合格客户的电子邮件信息
select xmlquery('$c/Client/email' 
passing contactinfo as "c") 
from clients 
where status = 'Gold'

第一行指定您要返回根“ Client”元素的“ email”子元素的值。 第二行和第三行指示DB2在哪里可以找到此信息-在“客户端”表的“ contactinfo”列中。 第四行进一步限定您的查询,以表明您仅对Gold客户的电子邮件地址感兴趣。 该查询将返回一组XML元素和值。 例如,如果您有500个Gold客户,每个客户都有一个电子邮件地址,那么您的输出将是一个包含500行的单列结果集,如清单10所示:

清单10.上一个查询的示例输出
1
--------------------------------------------

<email>user5976@anyprovider.com</email>
. . . 
<email>someID@yahoo.com</email>

如果您有多个针对单个Gold客户的电子邮件地址,则可能希望指示DB2仅返回主要地址(即,在客户的“ contactinfo”文档中找到的第一个电子邮件地址)。 您可以在查询的第一行中修改XPath表达式:

清单11.检索每个合格客户的第一个电子邮件地址
select xmlquery('$c/Client/email[1]' 
passing contactinfo as "c") 
from clients 
where status = 'Gold'

最后,如果您缺少某些Gold客户的电子邮件地址,则可能需要编写查询以从结果集中排除空值。 为此,通过向WHERE子句添加另一个谓词来测试缺少的电子邮件信息,来修改先前的查询。 您已经熟悉使您能够执行此操作SQL / XML函数XMLExists清单12显示了如何重写上一个查询,以过滤出联系信息(存储为XML)缺少电子邮件地址的Gold客户的任何行:

清单12.检索每个我们有至少一个电子邮件地址的合格客户的第一个电子邮件地址
select xmlquery('$c/Client/email[1]' 
passing contactinfo as "c") 
from clients 
where status = 'Gold'
and xmlexists('$c/Client/email' passing contactinfo as "c")

现在让我们考虑一种稍微不同的情况,在这种情况下,您需要检索多个XML元素值。 XMLTable从存储在XML列中的数据生成表格输出,对于为程序员提供XML数据的“关系”视图非常有用。 像XMLExistsXMLQuery一样, XMLTable函数使DB2在XML文档层次结构中导航以找到感兴趣的数据。 但是, XMLTable还包括将目标XML数据映射到SQL数据类型的结果集列的子句。

考虑下面的查询( 清单13 ),该查询从存储在“项目”表中的关系数据和XML数据中投影列。 (请参见清单2 ,查看“ items”表。)注释ID,客户ID和消息存储在XML文档的“评论”列中。 项目名称存储在SQL VARCHAR列中。

清单13.检索多个XML元素并将每个XML元素转换为传统SQL数据类型
select t.Comment#, i.itemname, t.CustomerID, Message from items i, 
xmltable('$c/Comments/Comment' passing i.comments as "c"
columns Comment# integer path 'CommentID',
	CustomerID integer path 'CustomerID',
	Message varchar(100) path 'Message') as t

第一行指定要包含在结果集中的列。 如查询的后续行所示,用引号引起来并以“ t”变量作为前缀的列是基于XML元素值的。 第二行调用XMLTable函数,以指定包含目标数据(“ i.comments”)的DB2 XML列以及该列的XML文档中相关元素所在的路径(在XML文档的“ Comment”子元素内)。根“注释”元素)。 第3到5行的“ columns”子句标识将映射到第1行上指定SQL结果集中的输出列的特定XML元素。此映射的一部分涉及指定XML元素值所对应的数据类型。将被转换。 在此示例中,所有XML数据都转换为传统SQL数据类型。

图2显示了运行该查询的示例结果。 如您所见,输出是一个简单SQL结果集。 请注意,列名称已折叠为大写字母-SQL经常出现。

图2.使用XMLTable函数的查询的示例输出
查询结果屏幕显示四列数据

如果需要,可以使用XMLTable创建也包含XML列的结果集。 例如,以下语句产生的结果集与上一个语句类似,不同的是,“消息”数据包含在XML列而不是SQL VARCHAR列中。

清单14.检索多个XML元素并将其转换为传统SQL或XML数据类型
select t.Comment#, i.itemname, t.CustomerID, Message from items i, 
xmltable('$c/Comments/Comment' passing i.comments as "c"
columns Comment# integer path 'CommentID',
	CustomerID integer path 'CustomerID',
	Message XML by ref path 'Message') as t

创建XML数据的关系视图

您可能会想到,SQL / XML函数可用于定义视图。 如果您想为您SQL应用程序程序员提供本机XML数据的关系模型,这将特别有用。

在XML列中的数据上创建关系视图并不比投影XML元素值复杂得多。 您只需编写一个调用XMLTable函数SQL / XML SELECT语句,并将其用作视图定义的基础。 清单15中的以下示例基于“ items”表的XML和非XML列中的信息创建视图。 (它类似于清单13中的查询。)

清单15.基于XMLTable的输出创建视图
create view commentview(itemID, itemname, commentID, message, mustrespond) as 
select i.id, i.itemname, t.CommentID, t.Message, t.ResponseRequested from items i, 
xmltable('$c/Comments/Comment' passing i.comments as "c"
columns CommentID integer path 'CommentID',
	Message varchar(100) path 'Message',
	ResponseRequested varchar(100) path 'ResponseRequested') as t;

尽管在XML列数据上创建关系视图很容易,但是如果不使用V9.7,则应仔细考虑使用它们。 在V9.7之前的版本中,针对此类视图发出查询时,DB2不使用XML列索引。 因此,如果您对ResponseRequested元素建立索引并发出SQL查询,将“ mustrespond”列的结果限制为某个值,那么DB2将读取所有XML文档并搜索适当的“ ResponseRequested”值。 除非您有少量数据,否则这会降低运行时性能。 因此,在升级到V9.7之前,DB2将在SQL谓词上使用XML索引时,请注意此处。

连接XML和关系数据

到目前为止,您可能想知道如何将XML数据与非XML数据(例如,基于传统SQL类型的关系数据)结合在一起。 DB2使您可以使用单个SQL / XML语句来完成此操作。 尽管有多种方式来制定此类联接,但根据您的数据库架构和工作负载要求,我们将在此处介绍一个示例。 您可能会惊讶地发现,您已经对SQL / XML足够了解,可以完成工作。

回想一下,“ items”表中的XML列包含一个“ CustomerID”元素。 这可以用作“客户”表中基于整数的“ id”列的连接键。 因此,如果要报告对一个或多个产品进行了评论的客户的名称和状态的报告,则必须将一个表中的XML元素值与另一个表中SQL整数值连接在一起。 实现此目的的一种方法是使用XMLExists函数,如清单16所示:

清单16.连接XML和非XML数据
select clients.name, clients.status from items, clients
where xmlexists('$c/Comments/Comment[CustomerID=$p]'
passing items.comments as "c", clients.id as "p")

第一行标识要包含在查询结果集中SQL列以及查询中引用的源表。 第二行包括您的join子句。 在这里, XMLExists确定一个目标源中的“ CustomerID”值是否等于从另一目标源派生的值。 第三行指定了这些来源:第一行是“ items”表中的“ comments” XML列,第二行是“ clients”表中的整数“ id”列。 因此,如果客户对任何项目都发表了评论,并且有关该客户的信息在“客户”表中可用,则XMLExists表达式的计算结果将为“ true”,并且客户的姓名和状态信息将包含在报告中。

在SQL / XML中使用“ FLWOR”表达式

尽管我们仅讨论了一些功能,但是SQL / XML提供了许多强大的功能来查询XML数据并将该数据与关系数据集成。 确实,您已经看到了一些有关如何执行此操作的示例,但是我们将在此处讨论更多示例。

XMLExistsXMLQuery函数都使您能够将XQuery合并到SQL中。 我们前面的示例展示了如何通过简单的XPath表达式使用这些功能来导航到感兴趣的XML文档的一部分。 现在,让我们考虑一个简单的示例,其中在SQL查询中包括XQuery。

XQueries可能包含以下一些或全部子句:“ for ”,“ let ”,“ where ”,“ order by ”和“ return 。 它们共同构成FLWOR (发音为花朵)的表达。 SQL程序员可能会发现将XQueries合并到其SELECT列表中以将XML文档的片段提取(或投影)到其结果集中很方便。 尽管这不是使用XMLQuery函数的唯一方法,但这是本文介绍的方案。 (本系列的后续文章将更深入地讨论XQuery。)

假设您要检索“金牌”客户的姓名和主要电子邮件地址。 在某些方面,该任务与我们先前探讨如何投影XML元素值的工作(参见清单11 )相似。 在这里,您将XQuery(带有“ for ”和“ return ”子句)作为XMLQuery函数的输入:

清单17.使用XQuery的“ for”和“ return”子句检索XML数据
select name, xmlquery('for $e in $c/Client/email[1] return $e' 
passing contactinfo as "c") 
from clients
where status = 'Gold'

第一行指定客户名称和XMLQuery函数的输出将包含在结果集中。 第二行指示将返回“客户”元素的第一个“电子邮件”子元素。 第三行标识了XML数据的来源-“ contactinfo”列。 第4行告诉我们,此列位于“客户”表中。 最后,第五行表明只有“金牌”客户对我们感兴趣。

由于此示例非常简单,因此您可以在此处编写相同的查询。 相反,您可以像以前一样以更紧凑的方式编写相同的查询:

清单18.以更紧凑的方式重写先前的查询
select name, xmlquery('$c/Client/email[1]' 
passing contactinfo as "c") 
from clients
where status = 'Gold'

但是,XQuery的return子句使您可以根据需要转换XML输出。 例如,您可以提取电子邮件元素值并将其发布为HTML。 以下查询将产生一个结果集,其中每个Gold客户的第一个电子邮件地址都作为HTML段落返回。

清单19.检索XML并将其转换为HTML
select xmlquery('for $e in $c/Client/email[1]/text() 
return <p>{$e}</p>' 
passing contactinfo as "c") 
from clients
where status = 'Gold'

第一行表示您对符合条件的客户的第一个电子邮件地址的文本表示感兴趣。 第二行指定此信息在返回之前将被HTML段落标签包围。 特别是,大括号({})指示DB2评估封闭的表达式(在这种情况下为“ $ e”)而不是将其视为文字字符串。 如果省略大括号,则DB2将为每个符合条件的客户记录返回一个包含“ <p> $ e </ p>”的结果集。

将关系数据发布为XML

到目前为止,我们一直专注于查询,提取或转换DB2 XML列中包含的数据的方法。 而且,如您所见,所有这些功能都可以通过SQL / XML获得。

SQL / XML还提供了其他便捷功能。 其中包括将关系数据转换或发布为XML的能力。 在这方面,本文仅涵盖三个SQL / XML函数: XMLElementXMLAggXMLForest

XMLElement允许您将存储在传统SQL列中的数据转换为XML片段。 也就是说,您可以从基本SQL数据构造XML元素(带有或不带有XML属性)。 下面的示例嵌套使用XMLElement函数来创建一系列项目元素,每个项目元素都包含从“项目”表中获得的ID,品牌名称和库存单位(sku)值的子元素:

清单20.使用XMLElement将关系数据发布为XML
select xmlelement (name "item", 
	xmlelement (name "id", id), 
	xmlelement (name "brand", brandname), 
	xmlelement (name "sku", sku) ) from items 
where srp < 100

运行此查询将产生类似于以下结果:

清单21.先前查询的示例输出
<item>
  <id>4272</id>
  <brand>Classy</brand>
  <sku>981140</sku>
</item>
. . . 
<item>
  <id>1193</id>
  <brand>Natural</brand>
  <sku>557813</sku>
</item>

您可以将XMLElement与其他SQL / XML发布功能结合在一起,以构造和分组XML值,并根据需要将它们嵌套在层次结构中。 清单22中的示例使用XMLElement创建customerList元素,其内容按“状态”列中的值分组。 对于每个“ customerList”记录, XMLAgg函数返回一系列customer元素,每个元素都包含基于我们的“ name”和“ status”列的子元素。 此外,您看到客户元素值按客户名称排序。

清单22.聚合和分组数据
select xmlelement(name "customerList",
xmlagg (xmlelement (name "customer", 
xmlforest (name as "fullName", status as "status") )
order by name ) )
from clients 
group by status

假设我们的“客户”表包含三个不同的“状态”值:“金”,“银”和“标准”。 运行前一个查询将导致DB2返回三个customerList元素,每个元素可能包含多个进一步包含名称和状态信息的customer子元素。 因此,输出将类似于:

清单23.上一个查询的示例输出
<customerList>
  <customer>
    <fullName>Chris Bontempo</fullname>
    <status>Gold</status>
  </customer>
  <customer>
    <fullName>Ella Kimpton</fullName> 
    <status>Gold</status>
  </customer>
. . . 
</customerList>
<customerList>
  <customer>
    <fullName>Lisa Hansen</fullName>
    <status>Silver</status>
  </customer>
. . .
</customerList>
<customerList>
  <customer>
    <fullName>Rita Gomez</fullName>
    <status>Standard</status>
  </customer>
. . .
</customerList>

更新和删除操作

尽管本文的重点是使用SQL搜索和检索存储在XML列中的数据,但是值得花一些时间考虑其他两项常见任务:更新和删除XML列中的数据。

DB2 9使用户能够使用SQL和SQL / XML语句更新和删除XML数据。 确实,由于XQuery标准的最初草案并未解决这些问题,因此DB2用户必须依靠SQL来完成这些任务。 但是,W3C正在开发XQuery更新工具,该工具在DB2 9.5中实现。 XQuery更新工具(最初称为TRANSFORM)的添加大大简化了XML文档中属性和元素的更新,并为此建立了标准。 XQuery更新工具现在处于候选推荐状态。

更新XML数据

虽然DB2 9使您可以使用SQL UPDATE语句或通过使用系统提供的存储过程( DB2XMLFUNCTIONS.XMLUPDATE )更新XML列,但对于DB2 9.5,可以使用新的XQuery Update Facility。 这允许在现有XML文档中更新,插入,删除和创建新元素或属性,而不必重新创建整个文档。 更新工具还可以用于修改同一事务中的多个节点。

例如,如果您要发出UPDATE语句以更改特定客户的联系信息的电子邮件地址,则只需提供新的电子邮件地址。

考虑以下语句:

清单24.样例UPDATE语句
update clients
set contactinfo = xmlquery( '
          copy $new := $CONTACTINFO
          modify do replace value of $new/client/email with "newemail@someplace.com"
          return  $new' ) 
where id = 3227;

copy $new ”,“ modify do replace of $new ”和“ return $new ”是XQuery Update工具的必需子句。 您可以在下面的“ 相关主题”部分中了解有关确切语法和选项的更多信息。 我们同时提供了XQuery规范的网站和developerWorks文章,其中提供了有关XQuery Update Facility的更多详细信息。

删除XML数据

删除包含XML列的行是一个简单的过程。 SQL DELETE语句使您可以标识(或限制)要通过WHERE子句删除的行。 该子句可以包括简单的谓词以标识非XML列值,或者可以包括SQL / XML函数以标识XML列中包含的XML元素值。

例如,以下是如何删除客户ID 3227的所有客户信息:

清单25.删除特定客户端的数据
delete from clients 
where id = 3227

您还记得如何将SQL SELECT语句限制为仅对邮政编码为95116的客户返回行吗? 如果是这样,您可以轻松地将该知识应用于删除跟踪那些客户的行。 使用XMLExists如下:

清单26.删除特定邮政编码中的客户端数据
delete from clients
where xmlexists('$c/Client/Address[zip="95116"]'
passing clients.contactinfo as "c");

索引编制

最后,值得注意的是,您可以创建专门的XML索引来加快对XML列中存储的数据的访问。 因为这是一篇介绍性文章,并且样本数据很小,所以本文不在此主题范围内。 但是,在生产环境中,定义适当的索引对于实现最佳性能至关重要。 本文的“ 相关主题”部分可以帮助您了解有关新的DB2索引技术的更多信息。

摘要

本文介绍了很多基础知识,重点介绍了SQL / XML的几个关键方面以及如何使用它来查询XML列中的数据。 当然,与SQL和SQL / XML函数相比,您可以做的更多。 本文包含一个简单的Java示例 ,该示例说明了如何在SQL / XML中使用参数标记来查询XML列中的数据。 在以后的文章中,我们将更详细地讨论应用程序开发问题。 但是,下一篇文章将探讨XQuery的一些有趣方面,XQuery是DB2 9支持的一种新查询语言。

致谢

感谢George Lapis,Matthias Nicola,Sriram Padmanabhan,Gary Robinson,Hardeep Singh和Bert Van der Linden对本文的帮助。


翻译自: https://www.ibm.com/developerworks/data/library/techarticle/dm-0603saracco2/index.html

sql 查询xml数据

Logo

魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。

更多推荐