IQueryFilter的WhereClause详解

来源:互联网 发布:usb网络共享驱动下载xp 编辑:程序博客网 时间:2024/06/14 05:30

IQueryFilter.whereclause属性 

IQueryFilter是进行查询选择时经常用到的接口,它可以帮助用户过滤不需要的值或者选择适当的要素。  

IQueryFilter.whereclause属性允许用户设定过滤表达式限定返回的要素。举个例子,我们可以使用下面的表达式来选取面积大于1500平方米的多边形: "Area" >1500. 

这种表达式实质上是一种SQL查询。其查询语法视乎用户正在使用的数据源,即数据库或者数据源上的原本格式(native format. 

为了方便用户,ARCGIS提供了一个叫ISQLSyntax 的接口(在workspace下),用来获取数据源的SQL语法信息,包括间隔符,大小写等信息。对于SQL语法规则不清楚的,

  

字段名规则

     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'. 

存储在AccessPersonal 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#'"将发生错误

在查询统计中,如果对结果精确不是很严格,可以将部分字段过滤:

IFeatureClass.Fields.getField(i).Type==esriFieldType.esriFieldTypeString    当然最好是对不同类型数据进行不同判断

0 0