SQL 语句是标准的计算机查询语句,SuperMap 中的许多查询功能都是通过构建 SQL 语句来完成的。一般情况下,SQL 表达式的语法为“Select…(需要输出的字段名) from … (数据集名)where…(查询条件)(order by …ascending/descending)(结果排序字段,可选)”。其中 Select, from, order by 等后面的参数都可以直接在 SQL 对话框中的列表或下拉列表中选择,而查询条件(Where–Clause语句)是需要我们自己构建的。本文将主要介绍一些常用的查询条件的构建。
需要注意的是,由于文件型数据源中的属性信息是以 Access 格式存储的,所以在对文件型数据进行查询的时候使用的通配符可能与通常在 SQL 或 Oracle 数据库中查询使用的通配符不大一致,下面以示范数据 World 工作空间中的 World 数据集为例进行详细介绍。
对数值的查询
对数值的查询可以使用 =, <>, >, <, <=, >=, Between…and 等等。
例如:
World.Pop_1994 Between 10000000 and 20000000
查询的是 pop_1994 字段值(1994年人口)在1000万到2000万之间的国家。
模糊查询
模糊查询使用 like,而且不同类型的数据源使用的匹配符不尽相同。
例如:
(1)部分匹配,使用“*”(注,数据库型和 UDB 数据源中的通配符为%,使用单引号)
World.CAPITAL like "布*",World.CAPITAL like '布%'
查询的是 World 数据集中 CAPITAL 字段中以“布”打头的那些国家。
(2)完全匹配(注,数据库型数据源中只能使用单引号;UDB 数据源使用单引号或双引号均可)
World.CAPITAL like "北京",World.CAPITAL like '北京'
查询的是 World 数据集中 CAPITAL 字段值为“北京”的国家。
(3)单字匹配,使用“_”(注,数据库型数据源和 UDB 数据源中的通配符为_)
World.CAPITAL like '达_'
查询的是 World 数据集中 CAPITAL 字段值为“达”后面仅加一个字符的国家。
查询特定值
使用 in,确定表达式的值是否等于指定列表内若干值中的任意一个值。
例如:
World.CAPITAL in ("北京","万象")
查询的是 World 数据集中 CAPITAL 字段值为“北京”,“万象”的一个或几个国家。
World.SmID in (1,4)
查询的是 World 数据集中 SmID 字段值为1或4的国家。
注意:对于字符型字段的查询需要将查询值使用单引号(”)或者双引号("")括起来,而数值型字段的查询不需要。对于数据库型数据源,字符型字段的值只能使用单引号。
查询某个字段值是否为空
使用 is NULL (is not NULL)
例如:
World.CAPITAL Is NULL
查询的是 World 数据集中 CAPITAL 字段值为空的那些国家。(有可能这些国家该字段忘记被赋值了。)
通过构造语句进行查询。
例如:
World.SmArea > World.SmPerimeter * 50000
查询的是 World 数据集中面积大于周长乘以50000的那些国家。
当然,在设置查询语句的时候,我们也可以使用()设置其优先级。例如:
World.POP_1994 / (World.SmArea/1000000) > 500
查询的是 World 数据集中,1994年的时候每平方公里(因为属性表中 Area 单位为米,所以使用 World.SmArea/1000000将其换算为平方公里)土地上人口大于500的国家。
组合语句
使用 and,将两个或者多个查询语句组合起来。
例如:
World.SmArea > 5000000000000 AND World.POP_1994 < 100000000
查询的是国土面积大于500万平方公里(上面的数值已经换算成平方米)并且1994年人口小于1亿的国家。
比较运算符在字符型字段中的应用
比较运算符,如>, <, >=, <=, <> 等等。
例如:
World.Country >= "芬兰"
查询的是 World 数据集中 Country 字段值的首字母在 F 到 Z 之间的那些国家。对于数据库型数据源,字符型字段的值只能使用单引号。
日期型字段的查询
例如对 UDB 数据源进行查询时,采用如下方式:
World.T_date = #1994-08-10 12:25:00#,World.T_date like #1994-08-10 %#
**注:**
- SQL(SQL+)数据源中,查询语句为: World.T_date = ‘1994-08-10 12:25:00’;
- ORACLE 数据源中,查询语句为: World.T_date = TO_DATE(‘1994-08-10’,‘YYYY-MM-DD’);
- UDB 数据源中,查询语句为:World.T_date = to_date(1994-08-10 12:25:00)
查询的是 World 数据集中 T_date 字段为1994-08-10的记录,即1994-08-10当天12:25:00的记录。
World.T_date Between #2010-01-01 0:0:0# and #2010-12-31 0:0:0#
查询的是 World 数据集中2010年全年的记录。
布尔型字段查询
布尔型字段属性值为 True 或者 False,SQL查询时用1表示True,0表示False。
例如:
City_R.Coastal = 1
查询的是 City_R 数据集中沿海的城市。
派生字段
例如:
Pop_1994 / SmArea
在查询结果属性表中会列出该临时字段。另外根据需要还可以给临时字段表达式起一个别名,只需在原字段表达式后键入空格,再加上“as”和别名即可,格式如下:
Pop_1994/ SmArea as Pop_Density
别名是任选的,若给字段表达式一个别名,则在属性表窗口显示时该别名将作为该临时字段名出现在对应列的顶部。若不给定别名,系统则使用表达式内容本身作为临时字段名。若指定多个派生字段表达式,可用逗号分隔。
注意事项
对双精度(Double)类型数值进行比较查询时,当使用”=“符号查询时,由于精度问题,可能查询不到结果。不推荐用户直接使用“=”进行查询。