# 前言
主要介绍一下按属性选择,涉及到数据库的一些知识。
按属性选择
对数据处理过程中,往往需要分类操作,就涉及到按属性对要素进行选择。基本原理即提供一个 SQL 查询表达式(SELECT * FROM 图层名 WHERE SQL语句),我们所需要提供的就是WHERE后面的SQL语句。
在按属性选择对话框中可以选择字段的排序方式以及显示字段别名。
SQL 语法
ArcGIS 查询表达式的一般格式:
字段名+运算符+值或字符串
对于组合查询,使用以下格式:
字段名+运算符+ 值或字符串+连接符+字段名+运算符+值或字符串+...
也可以使用括号 () 来定义组合查询中的运算顺序。
所使用的 SQL 语法因数据源的不同而有所差异,需要了解的是SQL是个ANSI标准,各数据库厂商根据该标准开发自己的数据库及语言,所以基本的使用很少涉及到。
字段名
字段名一般多是双击字段列表,下面简要说明,可以选择对应数据格式验证,也可直接跳过。
任何基于文件的数据可以将字段名称用双引号括起:"AREA"
个人地理数据库数据,可以将字段名称用方括号括起:[AREA]
对于个人地理数据库栅格数据集,应将字段名称用双引号括起:"AREA"
对于文件地理数据库数据,您可以将字段名称用双引号括起,但是通常不需要:AREA
值或字符串
字符串
查询中的字符串必须始终用单引号括起(与字段计算器不同,字段计算器字符串用双引号)。例如:
STATE_NAME = 'California'
- 表达式中的字符串区分大小写。对于要素类和表,可以用 UPPER 或 LOWER 函数设置所选项的大小写。例如:
UPPER(STATE_NAME) = 'RHODE ISLAND'
- 个人地理数据库要素类和表中的字符串不区分大小写。如果需要,可以使用与 UPPER 或 LOWER 等效的 UCASE 和 LCASE 函数。
- 如果字符串包含单引号,您首先需要使用另一单引号作为转义字符。例如:
NAME = 'Alfie''s Trough'
数值
查询中的数值在表达式中不能使用逗号作为小数分隔符或千位分隔符。
空值
在数据库中创建字段时可以选择默认值和是否允许为空(即为NULL),NULL值与零值或包含空格的字段是不同的。
而在DBF中创建字段没有选择默认值和是否允许为空选项,字符串默认为 ‘’,数值默认为0。
空值是在数据库中存在的,选择时不能使用NAME = NULL或者NAME > NULL,而要使用 IS,例如:
NAME IS NULL 或者 NAME IS NOT NULL
运算符
算术运算符
即加减乘除运算符:+-*/
比较运算符
< > <= >= <>
适用于字符串(基于字母顺序进行比较)、数值和日期。
例如,以下查询将选择名称的开头字母是 M 到 Z 的所有城市:
"CITY_NAME" >= 'M'
[NOT] BETWEEN x AND y
选择值大于等于 x 且小于等于 y 的记录。当前面有 NOT 时,将选择值在指定范围之外的记录。例如,以下表达式将选择值大于等于 1 且小于等于 10 的所有记录:
"OBJECTID" BETWEEN 1 AND 10
这与以下表达式等效:
"OBJECTID" >= 1 AND "OBJECTID" <= 10
但是,在查询具有索引的字段时使用包含 BETWEEN 的表达式效率会更高。(索引是对数据库表中一列或多列的值进行排序的一种结构,使用索引可快速访问数据库表中的特定信息,在挂接字段时经常提示是否创建索引)。
[NOT] IN
如果记录的某个字段包含多个字符串或值的其中一个,那么选择这条记录。当表达式前面包含 NOT 时,如果记录的某个字段不包含多个字符串或值的任何一个,那么将选择这条记录。例如,以下表达式将搜索四个不同的州名称:
"STATE_NAME" IN ('Alabama', 'Alaska', 'California', 'Florida')
对于文件地理数据库、个人地理数据库和 ArcSDE 地理数据库,此运算符还可用于子查询:
"STATE_NAME" IN (SELECT "STATE_NAME" FROM states WHERE "POP" > 5000000)
IS [NOT] NULL
选择指定字段为空值的记录。如果 NULL 前面有 NOT,则将选择指定字段中包含任意值的记录。例如,以下表达式将选择 POPULATION 中包含空值的所有记录:
"POPULATION" IS NULL
x [NOT] LIKE y [ESCAPE '转义字符']
将 LIKE 运算符(不是 = 运算符)与通配符结合使用可以构建对部分字符串的搜索。例如,以下表达式将从美国州名中选择 Mississippi 和 Missouri:
"STATE_NAME" LIKE 'Miss%'
百分号 (%) 表示该处可以是任意数量的任何字符:一个字符、一百个字符或无字符。此外,如果您希望在查询时通配符仅代表一个字符,可使用下划线 (_)。例如,以下表达式将找到 Catherine Smith 和 Katherine Smith:
"OWNER_NAME" LIKE '_atherine Smith'
百分号和下划线通配符适用于任何基于文件的数据或多用户地理数据库数据。LIKE 表达式的两侧都要有字符数据。如果需要访问非字符数据,请使用 CAST 函数。例如,以下查询将返回整数字段 SCORE_INT 中以 8 开头的数值:
CAST ("SCORE_INT" AS VARCHAR) LIKE '8%'
要在搜索字符串中包含百分号或下划线,请使用 ESCAPE 关键字来将另一种字符指定为转义字符,该字符表示紧接其后的是真正的百分号或下划线。例如,以下表达式将返回任何包含 10% 的任何字符串,例如 10% DISCOUNT 或 A10%:
"AMOUNT" LIKE '%10$%%' ESCAPE '$'
在查询个人地理数据库时,使用通配符“*”代表任意数量的字符,而使用“?”来代表一个字符。还可以使用井号 (#)
通配符来表示匹配单个数字(数值型值)。例如,以下查询将从个人地理数据库返回宗地编号 A1、A2 等等:
[PARCEL_NUMBER] LIKE 'A#'
[NOT] EXISTS
如果子查询返回至少一条记录则返回 TRUE;否则返回 FALSE。例如,如果 OBJECTID 字段包含一个值 50,则以下查询将返回 TRUE:
EXISTS (SELECT * FROM parcels WHERE "OBJECTID" = 50)
只有文件地理数据库、个人地理数据库和 ArcSDE 地理数据库支持 EXISTS,在不使用子查询时很少使用。
逻辑运算符
AND
结合两个条件,如果两个条件都为 true 则选择该记录。例如,以下表达式将选择面积大于 1,500 平方英尺且有一个能容纳 2 台以上汽车的车库的所有房屋:
"AREA" > 1500 AND "GARAGE" > 2
OR
结合两个条件,如果两个条件中至少有一个为 true 则选择该记录。例如,以下表达式将选择面积大于 1,500 平方英尺或有一个能容纳 2 台以上汽车的车库的所有房屋:
"AREA" > 1500 OR "GARAGE" > 2
NOT
选择与表达式不匹配的记录。例如,以下表达式将选择除 California 之外的所有州:
NOT "STATE_NAME" = 'California'