根据定义,XML元素和属性的值是区分大小写的。例如,如果搜索值为“Paris” 的 <CITY>元素,那么不会找到“PARIS”或“paris”。可以使用fn:upper-case()等XQuery函数解决这个问题,但是使用这些函数时不能使用XML索引,所以性能可能不好。本文解释如何使用DB2 pureXML 创建不区分大小写的数据库以及让XML查询和XML索引发挥预期的作用。用大写和小写函数执行不区分大小写的搜索。
下面的示例帮助您更清楚地理解不区分大小写的搜索。清单1定义一个包含一个INTEGER列和一个XML列的表,并在表中插入7行。每行包含一个小的客户文档,其中包含XML元素 <CITY>。
此元素中的值在大小写方面并不一致。一些值是全大写的,一些是全小写的,其他是大小写混合的(首字母大写)。如果数据来自不同的应用程序,而这些应用程序采用不同的大小写数据输入规则,就会出现这种情况。
清1. 示例表和数据
CREATE TABLE customer (id INTEGER, xmldoc XML); INSERT INTO customer (id, xmldoc) VALUES (1,'<Customer id="1"><city>PARIS</city></Customer>'), (2,'<Customer id="2"><city>Tokyo</city></Customer>'), (3,'<Customer id="3"><city>tokyo</city></Customer>'), (4,'<Customer id="4"><city>PARIS</city></Customer>'), (5,'<Customer id="5"><city>paris</city></Customer>'), (6,'<Customer id="6"><city>Delhi</city></Customer>'), (7,'<Customer id="7"><city>Paris</city></Customer>'); |
如果一个应用程序查询这些XML文档,寻找某一城市的客户,那么很可能需要不区分大小写的搜索。例如,可能希望找到 Paris 的所有客户,也就是希望获取第 1、4、5 和 7 行。但是,如果搜索值 “Paris”,那么只会返回第 7 行。要想获取所需的所有四行,可以使用 XQuery 函数 fn:upper-case() 把 city 元素值转换为大写并与 “PARIS” 做比较。清单 2 中的查询就采用这种方式,它会返回 Paris 的所有四个客户。
清单2. 选择 Paris的客户
SELECT id, XMLCAST( XMLQUERY('$XMLDOC/Customer/city') AS VARCHAR(15)) AS cityFROM customerWHERE XMLEXISTS('$XMLDOC/Customer[fn:upper-case(city) = "PARIS"]'); |
如果查询通过一个参数标志提供搜索值,那么这个参数也应该转换为大写,见 清单3。这个参数标志(“?”)的类型为 VARCHAR(15)并作为变量“c” 传递给XQuery谓词。
清单3. 使用参数标志选择客户
SELECT id, XMLCAST( XMLQUERY('$XMLDOC/Customer/city') AS VARCHAR(15)) AS cityFROM customerWHERE XMLEXISTS('$XMLDOC/Customer[fn:upper-case(city) = fn:upper-case($c)]'PASSING CAST(? AS VARCHAR(15)) AS "c"); |
图1显示以上示例查询的输出。
图 1. 示例查询的结果
原文出处:http://www.ibm.com/developerworks/cn/data/library/techarticles/dm-0811nicola/