xml检索忽视大小写
XMLTABLE概述
要理解本文,您应该熟悉DB2中的pureXML支持以及DB2中查询XML数据的基础知识。 如果您不理解这些主题,请参见本文的参考资料部分,以获得有关此主题的有用文章的列表。
XMLTABLE是一个SQL / XML函数,该函数评估XQuery表达式并将结果作为关系表返回。 XQuery表达式总是返回XML节点的序列,而XMLTABLE以关系格式的一组行返回此序列。 返回的表可以包含任何SQL类型的列,包括XML类型。
图1. 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