IQueryFilter的WhereClause详解
源自ESRI中国社区
(这篇随笔是根据ESRI Document Library里对IQueryFilter接口的描述翻译成的,有些地方觉得原文不太清晰,又自己找了点资料完善了一下,看资料还是中文快啊...)
IQueryFilter.whereclause属性
IQueryFilter是进行查询选择时经常用到的接口,它可以帮助用户过滤不需要的值或者选择适当的要素。
IQueryFilter.whereclause属性允许用户设定过滤表达式限定返回的要素。举个例子,我们可以使用下面的表达式来选取面积大于1500平方米的多边形: "Area" >1500.
这种表达式实质上是一种SQL查询。其查询语法视乎用户正在使用的数据源,即数据库或者数据源上的原本格式(native format).
为了方便用户,ARCGIS提供了一个叫ISQLSyntax 的接口(在workspace下),用来获取数据源的SQL语法信息,包括间隔符,大小写等信息。对于SQL语法规则不清楚的,也可参见:http://webhelp.esri.com/arcgisdesktop/9.2index.cfm?TopicName=SQL_reference.
字段名规则
1)如果是在file geodatabase, shapefile, dBase table, coverage, INFO table进行查询,那么字段名应该包含在双引号内: "AREA"
2)如果是在personal geodatabase进行查询,字段名需用方括号括起来:[AREA]
3)假如在ArcSDE的地理地理数据库(例如通过数据库连接方式连接到某个ArcSDE的企业地理数据库,或者连接到某个运行着ArcSDE Personal Edition or Workgroup Edition的数据库服务器)或是在ArcIMS image service or feature service是,字段在查询时不需括起来:AREA.
4)在Excel或者文本文件上查询时,字段需用单引号括起,除非你正使用的是表格窗口上Select By Attributes对话框,这种情况下,使用方括号[AREA].
字符串规则
在whereclause表达式里,字符串要用单引号括着,例如:"STATE_NAME" = 'California'.
存储在Access的Personal geodatabases是不区分大小写的(case insensetive),而ArcSDE, File and shapefiles则会区分大小写(case sensetive)。对区分大小写的数据源(datasource),可以使用SQL函数来统一大小写,以避免查询失败。
举个例子,假设某个给定的字段名为"Florida", 如果whereclause 是 "State_name = 'florida'",personal geodatabase返回的是美国的一个州,而在shapefiles and ArcSDE则查询不到。
下面的表达式会选择姓氏为Jones或者JONES的客户:UPPER("LAST_NAME") = 'JONES'
通配符规则
当你不确定查询字段名或者想用简短的字符串时,可以使用通配符。通配符是一个特殊的符号,用于代表一个或者多个字符,一般包括这几个: “%”,“*”,“ _”,“ ?".
如果你是在coverage, shapefile, INFO table, dBASE table, or shared geodatabase查询,那么'_' 表示任何一个字符,而 '%' 表示0到任意个字符.
如果你是在personal geodatabase查询,那么'?' 表示任何一个字符,而 '*' 表示0到任意个字符.
注意:如果字符串中通配符跟着操作符“=”,那么它将被视为字符串,而不是通配符。
NULL关键字
在geodatabases里字段支持NULL,在shapefiles/dBASE tables and coverages/INFO tables,时间字段可以为NULL.
NULL一般前面都跟着IS或者IS NOT.
唯一(Distinct)关键字
file geodatabases不支持关键字Distinct,建议使用IDataStatistics::UniqueValues方法返回唯一值。
SubQuery(子查询)
子查询就是允许嵌套的SQL查询,只适用于geodatabase数据源。
Query Numbers(查询数字)
操作数字的操作符包括: equal (=), not equal (<>), greater than (>), less than (<), greater than or equal (>=), and less than or equal (<=) operators.
Query Date (查询时间)
查询时间的语法取决于数据类型。在查询时间值时,应该了解正在使用的data source如何表示Date.
举个例子,在.dbf下查询时间,用"Date_Carte = date '1992/02/04'" ,而 "Date_Carte = '1992/02/04'" 或者"Date_Carte = '#1992/02/04#'"将发生错误。