SQL 参考

本主题将介绍 ArcGIS 中的选择表达式所用的常规查询的各个元素。ArcGIS 中的查询表达式使用常规 SQL 语法。

警告警告:

SQL 语法不适用于使用字段计算器计算字段。

字段

在 SQL 表达式中指定字段时,如果该字段名可能产生岐义(比如与 SQL 保留关键字相同),那么您只需提供一个分隔符即可。

由于存在许多保留关键字,并且后续版本中还能添加新的保留关键字,所以建议您始终使用分隔符将字段名称括起来。

DBMS 和 DBMS 之间的字段名分隔符有所不同。如果要查询任何基于文件的数据(例如,文件地理数据库、ArcSDE 地理数据库数据,或者 ArcIMS 要素类或影像服务子图层中的数据),可以将字段名称用双引号括起:

"AREA"

如果要查询个人地理数据库数据,可以将字段名称用方括号括起:

[AREA]

对于个人地理数据库栅格数据集,应将字段名称用双引号括起:

"AREA"

字符串

查询中的字符串必须始终用单引号括起。例如:

STATE_NAME = 'California'
  • 表达式中的字符串区分大小写。对于要素类和表,可以用 UPPER 或 LOWER 函数设置所选项的大小写。例如:
    UPPER("STATE_NAME") = 'RHODE ISLAND'
  • 个人地理数据库要素类和表中的字符串不区分大小写。如果需要,可以使用与 UPPER 或 LOWER 等效的 UCASE 和 LCASE 函数。

进行部分字符串搜索所用的通配符还取决于所要查询的数据源。例如,在基于文件的或 ArcSDE 地理数据库数据源中,以下表达式将从美国州名称中选择 Mississippi 和 Missouri:

"STATE_NAME" LIKE 'Miss%'

百分号 (%) 表示这个位置可以是任意字符,即 1 个字符、100 个字符或者无字符均可。在查询个人地理数据库时,使用通配符“*”代表任意数量的字符,而使用“?”来代表一个字符。

字符串函数可用来格式化字符串。例如,LEFT 函数将返回字符串左侧特定数量的字符。在以下示例中,查询将返回以字母 A 开头的所有州:

LEFT("STATE_NAME",1) = 'A'

有关支持的函数列表,请参阅 DBMS 文档。

数值

无论您的区域设置如何,小数点 (.) 将始终用作小数分隔符。在表达式中不能使用逗号作为小数分隔符或千位分隔符。

可以使用等于 (=)、不等于 (<>)、大于 (>)、小于 (<)、大于等于 (>=) 和小于等于 (<=) 和 BETWEEN 运算符查询数值。例如:

"POPULATION" >= 5000

数值函数可用来格式化数值。例如,ROUND 函数可将文件地理数据库中的数值四舍五入到指定的小数位数:

ROUND("SQKM",0) = 500

有关支持的数值函数列表,请参阅 DBMS 文档。

日期和时间

基本规则

地理数据库数据源将日期保存在日期时间字段中。但是,ArcInfo coverage 和 shapefile 不是这样。

因此,下面所列的大部分查询语法都包含对时间的引用。在某些情况下,当已知字段只包含日期时,查询中的时间部分可以安全地省略掉;而在其他情况下则需要声明,否则查询将返回语法错误。

ArcMap 日期格式的主要目的是存储日期,不是时间。当基础数据库实际上使用日期时间字段时,可以在此字段中只存储时间,但最好不要这样做。查询时间会比较麻烦;例如,12:30:05 p.m. 会被存储为 '1899-12-30 12:30:05'。

注意注意:

基础数据库中日期的存储会参考 1899 年 12 月 30 日 00:00:00。这适用于此处所列出的所有数据源。

本部分内容的目的只是帮助您查询日期值,而非时间值。当存储了包含非空时间的日期(例如 1999 年 1 月 12 日 04:00:00)后,只查询该日期将不会返回这条记录,因为当向一个日期时间字段只传递日期时,系统会自动用零填充时间,所以将只检索该日期下时间为 12:00:00 a.m 的记录。

属性表内会以用户友好的格式来显示日期和时间(取决于用户的区域设置)而不是采用基础数据库的格式。这在大多数情况下都很适用,但也有一些缺点:

  • SQL 查询中显示的字符串可能会与表中显示的值稍有不同,尤其是当包含时间时。例如,输入的时间 00:00:15 将在属性表中(当您的区域设置为美国时)显示为 12:00:15 a.m.,对应于查询语法将是 Datefield = '1899-12-30 00:00:15'。
  • 属性表在用户保存编辑之前无法知道是何种基础数据源。它首先会尝试将输入的值格式化为符合自己的格式,然后在保存编辑内容时,会再尝试对生成的值进行调整以便存入数据库。因此,您可以在 shapefile 中输入一个时间值,但会发现当编辑内容保存时该值会被丢弃。随后该字段将包含值 '1899-12-30' 并显示 12:00:00 a.m. 或其他等效的值(取决于用户的区域设置)。

ArcSDE 地理数据库的日期时间语法

Informix

Datefield = 'yyyy-mm-dd hh:mm:ss'

查询的 hh:mm:ss 部分不能省略,即使等于 00:00:00 也是如此。

Oracle

Datefield = date 'yyyy-mm-dd'

请切记,这将不会返回时间不为空的记录。

在 Oracle 中查询日期的替代格式如下:

Datefield = TO_DATE('yyyy-mm-dd hh:mm:ss','YYYY-MM-DD HH24:MI:SS')

第二个参数 'YYYY-MM-DD HH24:MI:SS' 用于描述查询要用的格式。实际的查询可能类似于:

Datefield = TO_DATE('2003-01-08 14:35:00','YYYY-MM-DD HH24:MI:SS')

您可以使用精简形式:

TO_DATE('2003-11-18','YYYY-MM-DD')

同样,这将不会返回时间不为空的记录。

SQL Server

Datefield = 'yyyy-mm-dd hh:mm:ss'

当记录中未设置时间时,查询的 hh:mm:ss 部分可以省略。

替代格式如下:

Datefield = 'mm/dd/yyyy'

IBM DB2

Datefield = TO_DATE('yyyy-mm-dd hh:mm:ss','YYYY-MM-DD HH24:MI:SS')

查询的 hh:mm:ss 部分不能省略,即使时间等于 00:00:00 也是如此。

PostgreSQL

Datefield = TIMESTAMP 'YYYY-MM-DD HH24:MI:SS' Datefield = TIMESTAMP 'YYYY-MM-DD'

使用“等于”查询时必须指定完整的时间戳,否则将不会返回任何记录。如果查询的表中包含这些确切的时间戳(2007-05-29 00:00:00 或 2007-05-29 12:14:25)时,您可以用下列语句成功进行查询:

select * from table where date = '2007-05-29 00:00:00';

或者

select * from table where date = '2007-05-29 12:14:25';

如果使用其他运算符(如大于、小于、大于等于或小于等于),您不必指定时间,不过如果您希望更精确些也可以指定。以下两个语句都可以使用:

select * from table where date < '2007-05-29';
select * from table where date < '2007-05-29 12:14:25';

文件地理数据库、shapefile、coverage 和其他基于文件的数据源

文件地理数据库、shapefile 和 coverage 中的日期前面要加上 date

"Datefield" = date 'yyyy-mm-dd'

文件地理数据库支持在日期字段中使用时间,因此可将此加入到表达式中:

"Datefield" = date 'yyyy-mm-dd hh:mm:ss'

Shapefile 和 coverage 不支持在日期字段中使用时间。

注意注意:

文件地理数据库所用的所有 SQL 均基于 SQL-92 标准。

个人地理数据库

个人地理数据库中的日期使用井号 (#) 来分隔。

例如:

[Datefield] = #mm-dd-yyyy hh:mm:ss#

可以将其精简为 [Datefield] = #mm-dd-yyyy#。

替代格式

[Datefield] = #yyyy/mm/dd#

已知局限性

对连接的左侧部分(第一张表)的日期查询只适用于基于文件的数据源,如文件地理数据库、shapefile 和 DBF 表。不过,对于非基于文件的数据,如个人地理数据库数据和 ArcSDE 数据也有解决方法,如下文所述。

当使用为基于文件的数据源所开发的受限的 SQL 版本时,对连接的左侧部分的日期查询将获得成功。如果您没有使用此类数据源,可以强制表达式使用这种格式。您可以通过确保查询表达式涉及一个以上连接表的字段来实现此操作。例如,如果一个要素类和一张表(FC1 和 Table1)进行连接且均来自于某一个人地理数据库,则下列表达式将失败或不返回任何数据:

FC1.date = date #01/12/2001# FC1.date = date '01/12/2001'

要想查询成功,可以创建如下查询:

FC1.date = date '01/12/2001' and Table1.OBJECTID > 0

由于此查询涉及到两个表的字段,因此将使用受限的 SQL 版本。在此表达式中,连接创建期间匹配记录的 Table1.OBJECTID 始终 > 0,因此对于包含连接匹配项的所有行来说此表达式均为 true。

要确保选择 FC1.date = date '01/12/2001' 的每条记录,可使用下列查询:

FC1.date = date '01/12/2001' and (Table1.OBJECTID IS NOT NULL OR Table1.OBJECTID IS NULL)

此查询将选择 FC1.date = date '01/12/2001' 的所有记录,而无论每条记录是否是连接匹配项。

子查询

注意注意:

Coverage、shapefile 和其他基于非地理数据库文件的数据源不支持子查询。在版本化 ArcSDE 要素类和表上执行的子查询不会返回增量表中存储的要素。文件地理数据库对本部分所述的子查询提供了有限的支持,而个人地理数据库和 ArcSDE 地理数据库则提供完全支持。有关个人地理数据库和 ArcSDE 地理数据库中全套子查询功能方面的详细信息,请参阅您的 DBMS 文档。

子查询是指嵌套在另一个查询中的查询。子查询可用于应用谓词或聚合函数,或将数据与存储在另一张表中的值进行比较。可使用 IN 或 ANY 关键字来完成。例如,以下查询只会选择未列在表 indep_countries 中的国家:

"COUNTRY_NAME" NOT IN (SELECT "COUNTRY_NAME" FROM indep_countries)

此查询将返回国家中 GDP2006 大于 GDP2005 的所有要素:

"GDP2006" > (SELECT MAX("GDP2005") FROM countries)

对于表中的每条记录,子查询可能需要在其目标表中分析所有数据。在大型数据集上执行时可能极其缓慢。

文件地理数据库仅提供对以下子查询的支持:

  • IN 谓词。例如:
    "COUNTRY_NAME" NOT IN (SELECT "COUNTRY_NAME" FROM indep_countries)
  • 包含比较运算符的标量子查询。标量子查询返回单个值。例如:
    "GDP2006" > (SELECT MAX("GDP2005") FROM countries)
    对于文件地理数据库,集合函数 AVG、COUNT、MIN、MAX 和 SUM 只能用在标量子查询内。
  • EXISTS 谓词。例如:
    EXISTS (SELECT * FROM indep_countries WHERE "COUNTRY_NAME" = 'Mexico')

运算符

以下是文件地理数据库、shapefile、coverage 和其他基于文件的数据源所支持的查询运算符的完整列表。个人地理数据库和 ArcSDE 地理数据库也支持这些运算符,但这些数据源可能使用不同的语法。除了以下这些运算符外,个人地理数据库和 ArcSDE 地理数据库还支持一些其他功能。有关详细信息,请参阅 DBMS 文档。

算术运算符

算术运算符用于对数值进行加、减、乘、除的运算。

运算符

描述

*

乘法算术运算符

/

除法算术运算符

+

加法算术运算符

-

减法算术运算符

算术运算符

比较运算符

使用比较运算符可以将两个表达式进行比较。

运算符

描述

<

小于。适用于字符串(基于字母顺序进行比较)、数值和日期。

<=

小于或等于。适用于字符串(基于字母顺序进行比较)、数值和日期。

<>

不等于。适用于字符串(基于字母顺序进行比较)、数值和日期。

>

大于。适用于字符串(基于字母顺序进行比较)、数值和日期。

>=

大于或等于。适用于字符串(基于字母顺序进行比较)、数值和日期。例如,以下查询将选择名称的开头字母是 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] EXISTS

如果子查询返回至少一条记录则返回 TRUE;否则返回 FALSE。例如,如果 OBJECTID 字段包含一个值 50,则以下查询将返回 TRUE:

EXISTS (SELECT * FROM parcels WHERE "OBJECTID" = 50)
只有文件地理数据库、个人地理数据库和 ArcSDE 地理数据库支持 EXISTS。

[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#'
比较运算符

逻辑运算符

运算符

描述

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'
逻辑运算符

函数

以下是文件地理数据库、shapefile、coverage 和其他基于文件的数据源所支持的函数的完整列表。个人地理数据库和 ArcSDE 地理数据库也支持这些函数,但这些数据源可能使用不同的语法或函数名。除了以下这些函数外,个人地理数据库和 ArcSDE 地理数据库还支持一些其他功能。有关详细信息,请参阅 DBMS 文档。

日期函数

功能

描述

CURRENT_DATE

返回当前日期。

EXTRACT(extract_fieldFROM extract_source)

返回 extract_sourceextract_field 部分。extract_source 参数是一个日期时间表达式。extract_field 参数可以是下列任一关键字:YEAR、MONTH、DAY、HOUR、MINUTE 或 SECOND。

CURRENT TIME

返回当前时间。

日期函数

字符串函数

string_exp 表示的参数可以是列名、字符串文本或者另一个标量函数的结果,其基础数据类型可表示为字符型。

character_exp 表示的参数是长度可变的字符型字符串。

startlength 表示的参数可以是数值文本或者另一个标量函数的结果,其基础数据类型可表示为数值型。

这些字符串函数以 1 为基础;即字符串的第一个字符为字符 1。

功能

描述

CHAR_LENGTH(string_exp)

返回字符串表达式的字符长度。

CONCAT(string_exp1, string_exp2)

返回 string_exp2string_exp1 连接后得到的字符串。

LOWER(string_exp)

返回一个与 string_exp 相等的字符串,其中所有大写字符均会转换为小写字符。

POSITION(character_exp IN character_exp)

返回第一个字符表达式在第二个字符表达式中的位置。结果是一个确切的数值,采用预先定义的精度且小数位数为零。

SUBSTRING(string_exp FROM start FOR length)

返回一个从 string_exp 衍生而来的字符串,其起始字符位置由 start 指定,字符数由 length 指定。

TRIM(BOTH | LEADING | TRAILING trim_character FROM string_exp)

返回字符串的开头、末尾或两端移除 trim_character 后所得的 string_exp

UPPER(string_exp)

返回一个与 string_exp 相等的字符串,其中所有小写字符均会转换为大写字符。

字符串函数

数值函数

所有数值函数均返回数值型值。

numeric_expfloat_expinteger_exp 表示的参数可以是列名、另一个标量函数的结果或数值文本,其基础数据类型可表示为数值型。

功能

描述

ABS(numeric_exp)

返回 numeric_exp 的绝对值。

ACOS(float_exp)

返回作为角度的 float_exp 的反余弦值,用弧度表示。

ASIN(float_exp)

返回作为角度的 float_exp 的反正弦值,用弧度表示。

ATAN(float_exp)

返回作为角度的 float_exp 的反正切值,用弧度表示。

CEILING(numeric_exp)

返回大于或等于 numeric_exp 的最小整数。

COS(float_exp)

返回 float_exp 的余弦值,其中 float_exp 是以弧度表示的角度。

FLOOR(numeric_exp)

返回小于或等于 numeric_exp 的最大整数。

LOG(float_exp)

返回 float_exp 的自然对数。

LOG10(float_exp)

返回 float_exp 的以 10 为底的对数。

MOD(integer_exp1, integer_exp2)

返回 integer_exp1 除以 integer_exp2 所得的余数。

POWER(numeric_exp, integer_exp)

返回 numeric_expinteger_exp 次幂的值。

ROUND(numeric_exp, integer_exp)

返回四舍五入至小数点右侧第 integer_exp 位的 numeric_exp。如果 integer_exp 为负数,则 numeric_exp 将被四舍五入至小数点左侧第 |integer_exp| 位。

SIGN(numeric_exp)

返回 numeric_exp 正负号的标志。如果 numeric_exp 小于零,则返回 -1。如果 numeric_exp 等于零,则返回 0。如果 numeric_exp 大于零,则返回 1。

SIN(float_exp)

返回 float_exp 的正弦值,其中 float_exp 是以弧度表示的角度。

TAN(float_exp)

返回 float_exp 的正切值,其中 float_exp 是以弧度表示的角度。

TRUNCATE(numeric_exp, integer_exp)

返回截断至小数点右侧第 integer_exp 位的 numeric_exp。如果 integer_exp 为负数,则 numeric_exp 将被截断至小数点左侧第 |integer_exp| 位。

数值函数

CAST 函数

CAST 函数可将值转换为指定的数据类型。语法如下:

CAST(exp AS data_type)

exp 参数可以是列名、另一个标量函数的结果或是一个文本。Data_type 可以是下列任意关键字,可以用大写或小写形式指定:CHAR、VARCHAR、INTEGER、SMALLINT、REAL、DOUBLE、DATE、TIME、DATETIME、NUMERIC 或 DECIMAL。

有关 CAST 函数的详细信息,请参阅 CAST 和 CONVERT

相关主题

=================================================================

 

在 ArcGIS 中,查询表达式用于选择要素和表记录的子集。ArcGIS 中的查询表达式符合标准的 SQL 表达式。例如,您可以在使用按属性选择工具或查询构建器 对话框时使用此语法来设置图层定义查询

本主题将介绍如何构建基本的 WHERE 子句表达式。如果您刚刚开始使用 SQL,本主题会对您有所帮助。要获取更加详细的参考,请参阅在 ArcGIS 中使用的查询表达式的 SQL 参考

简单的 SQL 表达式

SELECT * FROM 构成了 SQL 表达式的第一部分,而系统会自动为您提供该语句。

查询表达式使用 Select * From <图层或数据集> Where 子句后面的一般格式(例如,SELECT * FROM <图层名称> WHERE 之后的 SQL 表达式部分)。

以下是 ArcGIS 查询表达式的一般格式:

<字段名> <运算符> <值或字符串>

对于组合查询,使用以下格式:

<字段名> <运算符> <值或字符串> <连接符> <字段名> <运算符> <值或字符串> ...

也可以使用括号 () 来定义组合查询中的运算顺序。

由于您是将列作为一个整体进行选择的,因此不能将 SELECT 限制为仅返回相应表中的部分列,原因是 SELECT * 语法是通过硬编码实现的。因此,除非在使用子查询时,否则无法在 ArcGIS 的 SQL 查询中使用 DISTINCT、ORDER BY 和 GROUP BY 等关键字。有关子查询的信息,请参阅在 ArcGIS 中使用的查询表达式的 SQL 参考

在从中构建查询表达式的多数 ArcGIS 对话框中,都会为您提供图层或表的名称(或者从下拉列表中选择)。例如:

查询表达式

表达式的下一个部分是 WHERE 子句,这是您必须构建的部分。基本的 SQL WHERE 子句如下所示

STATE_NAME = 'Alabama'

这样会在名为 STATE_NAME 的字段中选择包含“Alabama”的要素。

SQL 语法

所使用的 SQL 语法因数据源的不同而有所差异。每个 DBMS 都拥有各自的 SQL 方言。

要查询基于文件的数据(包括文件地理数据库、coverage、shapefile、INFO 表、dBASE 表、CAD 和 VPF 数据),请使用支持 SQL 功能的子集的 ArcGIS SQL 方言。要查询个人地理数据库,请使用 Microsoft Access 语法。要查询 ArcSDE 地理数据库,请使用基础 DBMS(即:Oracle、SQL Server、DB2、Informix 或 PostgreSQL)的 SQL 语法。

从中创建 SQL WHERE 子句的 ArcGIS 对话框会帮助您对所查询的数据库使用正确的语法。它们利用适当的分隔符列出正确的字段名称和值。而且还为您选择相关的 SQL 关键字和运算符。

搜索字符串

字符串必须始终用单引号括起。例如:

"STATE_NAME" = 'California'

表达式中的字符串区分大小写,但在查询个人地理数据库中的要素类和表时除外。要在其他数据格式中进行不区分大小写的搜索,您可使用 SQL 函数将所有值转换为相同的大小写形式。对于基于文件的数据源(如地理数据库或 shapefile),可使用 UPPER 或 LOWER 函数。

例如,以下表达式将选择姓氏存储为 Jones 或 JONES 这两种形式的客户:

UPPER("LAST_NAME") = 'JONES'

其他数据源也有类似的函数。例如,个人地理数据库中的 UCASE 和 LCASE 函数可执行同样的操作。

可使用 LIKE 运算符(而不是 = 运算符)来构建部分字符串搜索。例如,以下表达式将从美国州名称中选择 Mississippi 和 Missouri:

"STATE_NAME" LIKE 'Miss%'

% 表示其位置可以是任意数量的任何字符:一个字符、一百个字符或无字符。此外,如果您希望在查询时通配符仅代表一个字符,则可使用“_”。

例如,以下表达式将找到 Catherine Smith 和 Katherine Smith:

"OWNER_NAME" LIKE '_atherine smith'

上述通配符适用于任何基于文件的数据或 ArcSDE 地理数据库数据。在查询个人地理数据库时,使用通配符 * 来表示任意数量的字符,而使用 ? 来表示一个字符。

按属性选择 和查询构建器 对话框中,通配符以按钮的形式显示。您可单击相应的按钮来将通配符输入到正在构建的表达式中。构建查询时,仅显示适用于所查询的图层或表的数据源的通配符。

如果在字符串中同时使用通配符和 = 运算符,则此字符将被视为字符串的一部分,而不会将其视为通配符。

还可使用大于 (>)、小于 (<)、大于等于 (>=)、小于等于 (<=) 以及 BETWEEN 运算符,来基于排序顺序选择字符串值。例如,以下表达式将选择 coverage 中名称首字母为 M 到 Z 的所有城市:

"CITY_NAME" >= 'M'

查询字符串时,还可使用不等于 (<>) 运算符。

了解有关通配符的详细信息

NULL 关键字

可使用 NULL 关键字来选择指定字段为空值的要素和记录。NULL 关键字的前面始终使用 IS 或 IS NOT。

例如,要查找尚未输入 1996 年人口的城市,可使用

"POPULATION96" IS NULL

或者,要查找已输入 1996 年人口的城市,可使用

"POPULATION96" IS NOT NULL

搜索数字

可使用等于 (=)、不等于 (<>)、大于 (>)、小于 (<)、大于等于 (>=)、小于等于 (<=) 和 BETWEEN 运算符查询数字。

例如

"POPULATION96" >= 5000

无论区域设置如何定义,所列出的数值将始终使用点作为小数分隔符。在表达式中不能使用逗号作为小数分隔符或千位分隔符。

计算

可使用算术运算符 +、-、* 和 / 在查询中加入计算:

可在字段和数字之间进行计算。

例如:

"AREA" >= "PERIMETER" * 100

也可在字段之间进行计算。

例如,要查找人口密度小于等于每平方英里 25 人的所有国家,可使用以下表达式:

"POP1990" / "AREA" <= 25

运算符优先级

表达式求值顺序遵照标准的运算符优先级规则。例如,求值时,首先计算用括号括起的表达式部分,然后再计算其他未括起部分。

示例

"HOUSEHOLDS" > "MALES" * "POP90_SQMI" + "AREA"

与以下表达式的求值顺序不同

"HOUSEHOLDS" > "MALES" * ("POP90_SQMI" + "AREA")

可单击添加括号,然后输入要括起的表达式,也可高亮显示要括起的现有表达式,然后单击括号按钮 括号 将其括起。

组合表达式

通过使用 AND 和 OR 运算符将表达式组合在一起,可构建复杂表达式。

例如,以下表达式将选择面积超过 1,500 平方英尺的所有房屋和一个可容纳三台或更多汽车的车库。

"AREA" > 1500 AND "GARAGE" > 3

如果使用 OR 运算符,OR 运算符两侧的两个表达式中必须至少有一个为真时才会选择记录。

例如:

"RAINFALL" < 20 OR "SLOPE" > 35

在表达式开头使用 NOT 运算符可查找与指定表达式不匹配的要素或记录。

例如:

NOT "STATE_NAME" = 'Colorado'

NOT 表达式可与 AND 和 OR 组合。

例如,以下表达式将选择除 Maine 以外的所有新英格兰州。

"SUB_REGION" = 'New England' AND NOT "STATE_NAME" = 'Maine'

子查询

子查询是嵌套在另一个查询中的查询,仅受地理数据库数据源支持。子查询可用于应用谓词或聚合功能,或将数据与存储在另一张表中的值进行比较。例如,以下查询只会选择未列在表 indep_countries 中的国家:

"COUNTRY_NAME" NOT IN (SELECT "COUNTRY_NAME" FROM indep_countries)

有关详细信息,请参阅在 ArcGIS 中使用的查询表达式的 SQL 参考

查询日期

从中创建 SQL WHERE 子句的 ArcGIS 对话框会帮助您对所查询的数据库使用正确的数据语法。大多数情况下,只需单击字段、运算符和值,即可生成正确的语法。

原文地址:https://www.cnblogs.com/gisoracle/p/8925759.html