构建查询表达式

整理文档很辛苦,赏杯茶钱您下走!

免费阅读已结束,点击下载阅读编辑剩下 ...

阅读已结束,您可以下载文档离线阅读编辑

资源描述

构建查询表达式在ArcGIS中,查询表达式用于选择要素和表记录的子集。ArcGIS中的查询表达式符合标准的SQL表达式。例如,您可以在使用按属性选择工具或查询构建器对话框时使用此语法来设置图层定义查询。简单的SQL表达式SELECT*FROM构成了SQL表达式的第一部分,而系统会自动为您提供该语句。查询表达式使用Select*From图层或数据集Where子句后面的一般格式(例如,SELECT*FROM图层名称WHERE之后的SQL表达式部分)。以下是ArcGIS查询表达式的一般格式:字段名运算符值或字符串对于组合查询,使用以下格式:字段名运算符值或字符串连接符字段名运算符值或字符串...也可以使用括号()来定义组合查询中的运算顺序。由于您是将列作为一个整体进行选择的,因此不能将SELECT限制为仅返回相应表中的部分列,原因是SELECT*语法是通过硬编码实现的。因此,除非在使用子查询时,否则无法在ArcGIS的SQL查询中使用DISTINCT、ORDERBY和GROUPBY等关键字。在从中构建查询表达式的多数ArcGIS对话框中,都会为您提供图层或表的名称(或者从下拉列表中选择)。例如:表达式的下一个部分是WHERE子句,这是您必须构建的部分。基本的SQLWHERE子句如下所示STATE_NAME='Alabama'这样会在名为STATE_NAME的字段中选择包含“Alabama”的要素。SQL语法所使用的SQL语法因数据源的不同而有所差异。每个DBMS都拥有各自的SQL方言。要查询基于文件的数据(包括文件地理数据库、coverage、shapefile、INFO表、dBASE表、CAD和VPF数据),请使用支持SQL功能的子集的ArcGISSQL方言。要查询个人地理数据库,请使用MicrosoftAccess语法。要查询ArcSDE地理数据库,请使用基础DBMS(即:Oracle、SQLServer、DB2、Informix或PostgreSQL)的SQL语法。从中创建SQLWHERE子句的ArcGIS对话框会帮助您对所查询的数据库使用正确的语法。它们利用适当的分隔符列出正确的字段名称和值。而且还为您选择相关的SQL关键字和运算符。搜索字符串字符串必须始终用单引号括起。例如:STATE_NAME='California'表达式中的字符串区分大小写,但在查询个人地理数据库中的要素类和表时除外。要在其他数据格式中进行不区分大小写的搜索,您可使用SQL函数将所有值转换为相同的大小写形式。对于基于文件的数据源(如地理数据库或shapefile),可使用UPPER或LOWER函数。例如,以下表达式将选择姓氏存储为Jones或JONES这两种形式的客户:UPPER(LAST_NAME)='JONES'其他数据源也有类似的函数。例如,个人地理数据库中的UCASE和LCASE函数可执行同样的操作。可使用LIKE运算符(而不是=运算符)来构建部分字符串搜索。例如,以下表达式将从美国州名称中选择Mississippi和Missouri:STATE_NAMELIKE'Miss%'%表示其位置可以是任意数量的任何字符:一个字符、一百个字符或无字符。此外,如果您希望在查询时通配符仅代表一个字符,则可使用“_”。例如,以下表达式将找到CatherineSmith和KatherineSmith:OWNER_NAMELIKE'_atherinesmith'上述通配符适用于任何基于文件的数据或ArcSDE地理数据库数据。在查询个人地理数据库时,使用通配符*来表示任意数量的字符,而使用?来表示一个字符。在按属性选择和查询构建器对话框中,通配符以按钮的形式显示。您可单击相应的按钮来将通配符输入到正在构建的表达式中。构建查询时,仅显示适用于所查询的图层或表的数据源的通配符。如果在字符串中同时使用通配符和=运算符,则此字符将被视为字符串的一部分,而不会将其视为通配符。还可使用大于()、小于()、大于等于(=)、小于等于(=)以及BETWEEN运算符,来基于排序顺序选择字符串值。例如,以下表达式将选择coverage中名称首字母为M到Z的所有城市:CITY_NAME='M'查询字符串时,还可使用不等于()运算符。NULL关键字可使用NULL关键字来选择指定字段为空值的要素和记录。NULL关键字的前面始终使用IS或ISNOT。例如,要查找尚未输入1996年人口的城市,可使用POPULATION96ISNULL或者,要查找已输入1996年人口的城市,可使用POPULATION96ISNOTNULL搜索数字可使用等于(=)、不等于()、大于()、小于()、大于等于(=)、小于等于(=)和BETWEEN运算符查询数字。例如POPULATION96=5000无论区域设置如何定义,所列出的数值将始终使用点作为小数分隔符。在表达式中不能使用逗号作为小数分隔符或千位分隔符。计算可使用算术运算符+、-、*和/在查询中加入计算:可在字段和数字之间进行计算。例如:AREA=PERIMETER*100也可在字段之间进行计算。例如,要查找人口密度小于等于每平方英里25人的所有国家,可使用以下表达式:POP1990/AREA=25运算符优先级表达式求值顺序遵照标准的运算符优先级规则。例如,求值时,首先计算用括号括起的表达式部分,然后再计算其他未括起部分。示例HOUSEHOLDSMALES*POP90_SQMI+AREA与以下表达式的求值顺序不同HOUSEHOLDSMALES*(POP90_SQMI+AREA)可单击添加括号,然后输入要括起的表达式,也可高亮显示要括起的现有表达式,然后单击括号按钮将其括起。组合表达式通过使用AND和OR运算符将表达式组合在一起,可构建复杂表达式。例如,以下表达式将选择面积超过1,500平方英尺的所有房屋和一个可容纳三台或更多汽车的车库。AREA1500ANDGARAGE3如果使用OR运算符,OR运算符两侧的两个表达式中必须至少有一个为真时才会选择记录。例如:RAINFALL20ORSLOPE35在表达式开头使用NOT运算符可查找与指定表达式不匹配的要素或记录。例如:NOTSTATE_NAME='Colorado'NOT表达式可与AND和OR组合。例如,以下表达式将选择除Maine以外的所有新英格兰州。SUB_REGION='NewEngland'ANDNOTSTATE_NAME='Maine'子查询子查询是嵌套在另一个查询中的查询,仅受地理数据库数据源支持。子查询可用于应用谓词或聚合功能,或将数据与存储在另一张表中的值进行比较。例如,以下查询只会选择未列在表indep_countries中的国家:COUNTRY_NAMENOTIN(SELECTCOUNTRY_NAMEFROMindep_countries)查询日期从中创建SQLWHERE子句的ArcGIS对话框会帮助您对所查询的数据库使用正确的数据语法。大多数情况下,只需单击字段、运算符和值,即可生成正确的语法。在ArcGIS中使用的查询表达式的SQL参考本主题将介绍ArcGIS中的选择表达式所用的常规查询的各个元素。ArcGIS中的查询表达式使用常规SQL语法。警告:SQL语法不适用于使用字段计算器计算字段。字段在SQL表达式中指定字段时,如果该字段名可能产生岐义(比如与SQL保留关键字相同),那么您只需提供一个分隔符即可。由于存在许多保留关键字,并且后续版本中还能添加新的保留关键字,所以建议您始终使用分隔符将字段名称括起来。DBMS和DBMS之间的字段名分隔符有所不同。如果要查询任何基于文件的数据(例如,文件地理数据库、ArcSDE地理数据库数据,或者ArcIMS要素类或影像服务子图层中的数据),可以将字段名称用双引号括起:AREA如果要查询个人地理数据库数据,可以将字段名称用方括号括起:[AREA]对于个人地理数据库栅格数据集,应将字段名称用双引号括起:AREA字符串查询中的字符串必须始终用单引号括起。例如:STATE_NAME='California'表达式中的字符串区分大小写。对于要素类和表,可以用UPPER或LOWER函数设置所选项的大小写。例如:UPPER(STATE_NAME)='RHODEISLAND'个人地理数据库要素类和表中的字符串不区分大小写。如果需要,可以使用与UPPER或LOWER等效的UCASE和LCASE函数。进行部分字符串搜索所用的通配符还取决于所要查询的数据源。例如,在基于文件的或ArcSDE地理数据库数据源中,以下表达式将从美国州名称中选择Mississippi和Missouri:STATE_NAMELIKE'Miss%'百分号(%)表示这个位置可以是任意字符,即1个字符、100个字符或者无字符均可。在查询个人地理数据库时,使用通配符“*”代表任意数量的字符,而使用“?”来代表一个字符。字符串函数可用来格式化字符串。例如,LEFT函数将返回字符串左侧特定数量的字符。在以下示例中,查询将返回以字母A开头的所有州:LEFT(STATE_NAME,1)='A'数值无论您的区域设置如何,小数点(.)将始终用作小数分隔符。在表达式中不能使用逗号作为小数分隔符或千位分隔符。可以使用等于(=)、不等于()、大于()、小于()、大于等于(=)和小于等于(=)和BETWEEN运算符查询数值。例如:POPULATION=5000数值函数可用来格式化数值。例如,ROUND函数可将文件地理数据库中的数值四舍五入到指定的小数位数:ROUND(SQKM,0)=500有关支持的数值函数列表,请参阅DBMS文档。日期和时间基本规则地理数据库数据源将日期保存在日期时间字段中。但是,ArcInfocoverage和shapefile不是这样。因此,下面所列的大部分查询语法都包含对时间的引用。在某些情况下,当已知字段只包含日期时,查询中的时间部分可以安全地省略掉;而在其他情况下则需要声明,否则查询将返回语法错误。ArcMap日期格式的主要目的是存储日期,不是时间。当基础数据库实际上使用日期时间字段时,可以在此字段中只存储时间,但最好不要这样做。查询时间会比较麻烦;例如,12:30:05p.m.会被存储为'1899-12-3012:30:05'。注:基础数据库中日期的存储会参考1899年12月30日00:00:00。这适用于此处所列出的所有数据源。本部分内容的目的只是帮助您查询日期值,而非时间值。当存储了包含非空时间的日期(例如1999年1月12日04:00:00)后,只查询该日期将不会返回这条记录,因为当向一个日期时间字段只传递日期时,系统会自动用零填充时间,所以将只检索该日期下时间为12:00:00a.m的记录。属性表内会以用户友好的格式来显示日期和时间(取决于用户的区域设置)而不是采用基础数据库的格式。这在大多数情况下都很适用,但也有一些缺点:SQL查询中显示的字符串可能会与表中显示的值稍有不同,尤其是当包含时间时。例如,输入的时间00:00:15将在属性表中(当您的区域设置为美国时)显示为12:00:15a.m.,对应于查询语法将是Datefield='1899-12-3000:00:15'。属性表在用户保存编辑之前无法知道是何种基础数据源。它首先会尝试将输入的值格式化为符合自己的格式,然后在保存编辑内容时,会再尝试对生成的值进行调整以便存入数据库。因此,您可以在shapefile中输入一个时间值,但会发现当编辑内容保存时该值会被丢弃。随后该字段将包含值'1899-12-30'并显示12:00:00a.m.或其他等效的值(取决于用户的区域设置)。ArcSDE地理数据库的日期时间语法InformixDatefield='yyyy-mm-ddhh:mm:ss'查询的hh:mm:ss部分不能省略,即使等于00:00:00也是如此。OracleDatefield=date'yyyy-

1 / 18
下载文档,编辑使用

©2015-2020 m.777doc.com 三七文档.

备案号:鲁ICP备2024069028号-1 客服联系 QQ:2149211541

×
保存成功