在文件地理数据库中使用 SQL 进行报告和分析

文件地理数据库允许在 QueryDef 中通过 SubFields(字段列表)方法使用表达式和别名完善分析和报告。此外,通过 PostFixClause 支持 ORDER BY 和 GROUP BY。在支持 GROUP BY 时,表达式包括聚合函数,如 MIN、MAX 和 SUM。

ALIAS

提供给列另外一个名称以提供更易于理解的输出。

SQL

SELECT NAME, POP1997 - POP1990 as PopChange
FROM counties ORDER BY NAME

ArcObjects

pQueryDef.SubFields = "NAME, POP1997 - POP1990 as PopChange"
pQueryDef.Tables = "counties"
pQueryDef.PostfixClause = "ORDER BY NAME"

CASE

评估条件列表并返回多个结果表达式之一。

SQL

SELECT name,salary,
CASE
	WHEN salary <= 2000 THEN 'low'
	WHEN salary > 2000 AND salary <= 3000 THEN 'average'
	WHEN salary > 3000 THEN 'high'
	END AS salary_level
	FROM employees
	ORDER BY salary ASC

ArcObjects

pQueryDef.SubFields = "name,salary,
CASE
	WHEN salary <= 2000 THEN 'low'
	WHEN salary > 2000 AND salary <= 3000 THEN 'average'
	WHEN salary > 3000 THEN 'high'
	END AS salary_level"
	pQueryDef.Tables = " employees"
	pQueryDef.PostfixClause = " ORDER BY salary ASC "

COALESCE

返回其参数的第一个非空字段值。

SQL

SELECT Name, COALESCE(Business_Phone, Cell_Phone, Home_Phone)
Contact_Phone
FROM Contact_Info

ArcObjects

queryDef.SubFields = "Name, COALESCE(Business_Phone, Cell_Phone,
Home_Phone) Contact_Phone"
queryDef.Tables = "Contact_Info"

Contact_Info:

名称

Business_Phone

Cell_Phone

Home_Phone

Jeff

531-2531

622-7813

565-9901

Laura

空值

772-5588

312-4088

Peter

空值

空值

594-7477

结果:

名称

Contact_Phone

Jeff

531-2531

Laura

772-5588

Peter

594-7477

表达式

SQL

SELECT SIN(sunangle)
FROM sightings

ArcObjects

queryDef.SubFields = "SIN(sunangle)"
queryDef.Tables = "sightings"

设置函数

运算符 描述

AVG

计算组中所有值的平均值。空值会被忽略。

COUNT(*),COUNT(表达式)

COUNT(*) 返回表中的记录数。包括空值。COUNT(表达式)返回指定表达式的值数。空值将被忽略。

MAX

查找组中的最大值。空值会被忽略。

MIN

查找组中的最小值。空值会被忽略。

STDDEV, STDDEV_SAMP

返回表达式的样本标准差。

STDDEV_POP

返回表达式的总体标准差。

SUM

查找组中的值。空值会被忽略。

VAR, VAR_SAMP

返回表达式的样本方差。

VAR_POP

返回表达式的总体方差。

算述运算符

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

运算符 描述

*

乘法算术运算符

/

除法算术运算符

+

加法算术运算符

-

减法算术运算符

函数

以下是文件地理数据库支持的整个函数列表。

日期函数

函数 描述

CURRENT_DATE

返回当前日期。

EXTRACT (extract_field FROM extract_source)

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

CURRENT TIME

返回当前时间。

CURRENT_TIMESTAMP

返回当前时间和日期。

字符串函数

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| 位。

GROUP BY

用于按一或多列收集多条记录的数据并对结果进行分组

SQL

SELECT STATE_NAME, SUM(POP1990) as TotalPopulation
FROM counties
GROUP BY STATE_NAME ORDER BY STATE_NAME

ArcObjects

pQueryDef.SubFields = "STATE_NAME, SUM(POP1990) as
TotalPopulation"
pQueryDef.Tables = "counties"
pQueryDef.PostfixClause = "GROUP BY STATE_NAME ORDER BY
STATE_NAME"

HAVING

GROUP BY 的子句。

SQL

SELECT department, MAX(salary) as Highest_salary
FROM employees
GROUP BY department HAVING MAX(salary) < 50000

ArcObjects

queryDef.SubFields = "department, MAX(salary) as Highest_salary"
queryDef.Tables = "employees"
pQueryDef.PostfixClause = "GROUP BY department HAVING MAX(salary)
< 50000"

JOINS

合并两个或多个表的记录。

Cross Join

SQL

SELECT Table1.name, Table1.Address, Table2.name, Table2.Salary
FROM Table1 CROSS JOIN Table2

ArcObjects

queryDef.SubFields = "Table1.name, Table1.Address, Table2.name,
Table2.Salary"
queryDef.Tables = "Table1 CROSS JOIN Table2"

Inner Join

SQL

SELECT Table1.C1, Table1.C2, Table2.C3, Table2.C4 FROM Table1
INNER JOIN Table2 ON Table1.C1 = Table2.C3

ArcObjects

queryDef.SubFields = "Table1.C1, Table1.C2, Table2.C3,
Table2.C4"
queryDef.Tables = "Table1 INNER JOIN Table2 ON Table1.C1 =
Table2.C3"

Left Outer Join

SQL

SELECT Table1.C1, Table1.C2, Table2.C3, Table2.C4 FROM Table1
LEFT OUTER JOIN Table2 ON Table1.C1 = Table2.C3

ArcObjects

queryDef.SubFields = "Table1.C1, Table1.C2, Table2.C3,
Table2.C4"
queryDef.Tables = "Table1 LEFT OUTER JOIN Table2 ON Table1.C1 =
Table2.C3"

Right Outer Join

SQL

SELECT * FROM Table1 RIGHT OUTER JOIN Table2 ON Table1.C1 =
Table2.C3

ArcObjects

queryDef.SubFields = "*"
queryDef.Tables = "Table1 RIGHT OUTER JOIN Table2 ON Table1.C1 =
Table2.C3"

NULLIF

如果所提供的两个参数相等,则 NULLIF 返回空值;否则,返回第一个参数的值。

SQL

SELECT Location, NULLIF(Sales, Forecast) as Results FROM
StoreSales

ArcObjects

queryDef.SubFields = " Location, NULLIF(Sales, Forecast) as
Results"
queryDef.Tables = "StoreSales"

StoreSales:

位置 销售 预测

雷德兰兹

39000

55000

Palm Springs

60000

61000

Riverside

40000

40000

结果:

位置 结果

雷德兰兹

39000

Palm Springs

60000

Riverside

空值

ORDER BY

指定排序顺序。顺序可以是升序 (ASC) 或降序 (DESC),并将两者加以整理。排序规则类型包括 BINARY(BIN)、CASESENSITIVE(CASE) 和 NOCASESENSITIVE(NOCASE)。二进制排序规则区分大小写和重音。区分大小写排序规则区分大写和小写字母。不区分大小写排序规则不区分大写和小写字母。

SQL

SELECT STATE_NAME, POP1990
FROM counties ORDER BY STATE_NAME

ArcObjects

pQueryDef.SubFields = "STATE_NAME, POP1990"
pQueryDef.Tables = "counties"
pQueryDef.PostfixClause = "ORDER BY STATE_NAME"

SQL

SELECT STATE_NAME, POP1990
FROM counties ORDER BY STATE_NAME COLLATE BINARY ASC

ArcObjects

pQueryDef.SubFields = "STATE_NAME, POP1990"
pQueryDef.Tables = "counties"
pQueryDef.PostfixClause = "ORDER BY STATE_NAME COLLATE BINARY
ASC"
5/10/2014