xml检索忽视大小写_以关系格式检索XML数据

xml检索忽视大小写

XMLTABLE概述

要理解本文,您应该熟悉DB2中的pureXML支持以及DB2中查询XML数据的基础知识。 如果您不理解这些主题,请参见本文的参考资料部分,以获得有关此主题的有用文章的列表。

XMLTABLE是一个SQL / XML函数,该函数评估XQuery表达式并将结果作为关系表返回。 XQuery表达式总是返回XML节点的序列,而XMLTABLE以关系格式的一组行返回此序列。 返回的表可以包含任何SQL类型的列,包括XML类型。

图1. XMLTABLE概述
XMLTABLE概述

像任何SQL / XML函数一样,XMLTABLE嵌入在SQL语句中。 XMLTABLE函数的评估返回一个行集 ,其中每一列都有一个SQL数据类型。 这意味着它是一个表函数 ,而不是一个标量函数 。

要更详细地了解XMLTABLE函数,请查看以下示例表,该表包含两行,每行一个XML文档:

清单1是一个简单的XMLTABLE语句的示例。

清单1.示例表和数据
<dept bldg="101">
	<employee id="901">
		<name>
			<first>John</first>
			<last>Doe</last>
		</name>
		<office>344</office>
		<salary currency="USD">55000</salary>
	</employee>
	<employee id="902">
		<name>
			<first>Peter</first>
			<last>Pan</last>
		</name>
		<office>216</office>
		<phone>905-416-5004</phone>
	</employee>
</dept>



<dept bldg="114">
	<employee id="903">
		<name>
			<first>Mary</first>
			<last>Jones</last>
		</name>
		<office>415</office>
		<phone>905-403-6112</phone>
		<phone>647-504-4546</phone>
		<salary currency="USD">64000</salary>
	</employee>
</dept>

清单2是一个简单的XMLTABLE语句的示例。

清单2.一个简单的XMLTABLE示例
SELECT X.* 
FROM emp, 
XMLTABLE ('$d/dept/employee' passing doc as "d" 
   COLUMNS 
   empID 	INTEGER 	PATH '@id',
   firstname 	VARCHAR(20) 	PATH 'name/first',
   lastname 	VARCHAR(25) 	PATH 'name/last') AS X

在DB2中运行此查询将返回以下结果:

empID       firstname            lastname
----------- -------------------- -------------------------
        901 John                 Doe
        902 Peter                Pan
        903 Mary                 Jones

好奇如何运作? 在SELECT语句的FROM子句中使用XMLTABLE函数以及对其进行操作的表emp。 XMLTABLE函数与表emp隐式连接,并应用于表的每一行。

XMLTABLE函数包含一个生成行的 XQuery表达式,以及在COLUMNS子句中包含一个或多个生成列的表达式。 在清单1中 ,生成行的表达式是XPath $d/dept/employee 。 通过子句定义变量$d引用表emp的XML列doc

生成行的表达式将应用于XML列中的每个XML文档,并为每个文档生成一个或多个employee元素(子树)。 XMLTABLE函数的输出为每个employee元素包含一行。 因此,由行生成的XQuery表达式产生的输出确定SELECT语句的结果集的基数。

COLUMNS子句用于将XML数据转换为关系数据。 此子句中的每个条目都定义一个具有列名和SQL数据类型的列。 在上面的示例中,返回的行具有名为empID的 3列,分别为数据类型Integer,Varchar(20)和Varchar(25)的名字和姓氏 。 每列的值都是从employee元素中提取的, employee元素由生成行的XQuery表达式生成,并转换为SQL数据类型。 例如,将路径name/first应用于每个employee元素以获得列employee的值。 行生成表达式为列生成表达式提供上下文。 换句话说,通常可以将生成列的表达式附加到生成行的表达式上,以直观了解给定XMLTABLE函数在其列中返回的内容。

请注意,COLUMNS子句中的路径表达式每行不得返回多个项目。 如果路径表达式返回两个或多个项目的序列,则XMLTABLE执行通常会失败,因为无法将XML值序列转换为原子SQL值。 本文稍后将讨论这种情况。

XMLTABLE查询的结果集可以像任何SQL表一样对待。 您可以像使用常规行集或视图一样查询和操作它。 您可以使用db2-fn:xmlcolumn()或db2-fn:sqlquery()函数(仅适用于DB2 LUW)来指定输入到XMLTABLE函数的数据,而不是使用“ passing column as”子句。 例如,上面的清单2也可以如清单3所示编写,以产生相同的结果。

清单3. 清单1的另一种表示法:
SELECT X.* 
FROM 
   XMLTABLE ('db2-fn:xmlcolumn("EMP.DOC")/dept/employee' 
      COLUMNS 
      empID		INTEGER		PATH '@id',
      firstname	VARCHAR(20)		PATH 'name/first',
      lastname	VARCHAR(25)		PATH 'name/last') AS X

缺少元素

XML数据可以包含并非所有文档中都包含的可选元素。 例如,在清单1中,雇员Peter Pan没有薪金元素,因为在我们的示例场景中,它不是必填数据字段。 这很容易处理,因为XMLTABLE函数只是为缺少的元素生成空值,因此您可以编写XMLTABLE查询,就好像薪水元素始终存在一样。 清单4说明了这一点:

清单4.清单2的扩展,它也产生一个薪水列
SELECT X.* 
FROM emp, 
XMLTABLE ('$d/dept/employee' passing doc as "d" 
   COLUMNS 
   empID        INTEGER         PATH '@id
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值