定义查询图层源的 SQL 语句是静态的。但是,在某些情况下,SQL 语句的某些部分无法提前知晓。例如,如果您要显示合计降雨量,您可能无法知道地图的读者是想要按天、按周还是按月收集一次雨量站的值。查询图层中的参数可使得 SQL 语句的组成部分变为动态。您可以将查询参数当作 SQL 语句的变量,进行查询时即会定义该变量的值。以下是查询参数的两种类型:
- 范围参数可将数值或时态值动态连接至范围和时间滑块。例如,考虑 SQL 查询包括范围参数 WHERE ::r:myRangeVar1 的情况。 发送至数据库的 SQL 查询为 WHERE aField = value 或 WHERE aField => value1 AND aField <= value2,具体取决于范围滑块传递的是一个值还是两个值。
- 离散参数可在进行查询时更新具有文本值的查询。例如,考虑用于定义查询图层的 SQL 查询包括两个离散参数 WHERE city_population > ::population AND state_name = ::name 的情况。在分别为每个参数指定如 10000 和 California 这样的值时,发送至数据库的 SQL 查询为 WHERE city_population > 10000 AND state_name = 'California'。
范围参数
范围参数可与数值(整型或双精度型)或日期时间值结合使用,以在时间或范围滑块上动态显示数据。该变量可在没有引用字段或表达式的情况下进行声明,同时 SQL 查询中不使用任何逻辑运算符。相反,系统会将字段或表达式设置为参数属性。范围参数将使用关键字 ::r: 作为前缀。您可在 SQL 查询 WHERE 子句依赖于 SELECT 列表以外的字段时使用范围参数。
示例:WHERE ::r:MyRangeParameter
在声明范围参数时,必须指定字段或表达式、数据类型,也可根据需要指定滑块中使用的默认值和别名。单击默认值以输入最小和最大默认值。当选中此框时,必须至少输入一个值来验证表达式。默认值可为值文本(实际数字或日期)或可返回指定数据类型值的表达式。
以下步骤介绍了如何对名为 earthquakes 的表中的范围参数进行定义以显示最近七天(默认时间段)的地震,并根据需要使用时间滑块更改此时间段。
- 在地图选项卡的图层组中打开添加数据菜单并单击查询图层。
- 在连接菜单中,选择数据库连接或使用新建地理数据库连接 创建新的连接。
- 在名称字段中,输入 Earthquakes。
- 在查询框中,输入 select * from EARTHQUAKES where ::r:EQDateRange。
- 将鼠标悬停在代码中的 ::r:EQDateRange 参数上方,并单击编辑查询 以编辑属性。
- 输入下列参数属性:
- 对于字段或表达式,输入日期时间字段的名称。
- 选择日期作为数据类型。
- 选中默认值。
- 根据基础数据库,输入默认值表达式。下表显示了多个数据库的一些示例。有关可配置为使用查询图层的数据库完整列表,请参阅查询图层的数据库和客户端配置。
数据库 起始值 终止值 Microsoft SQL Server
dateadd(dd, -7, cast(getdate() as date)) cast(getdate() as date) Oracle
trunc(CURRENT_DATE) - INTERVAL '7' DAY trunc(CURRENT_DATE) PostgreSQL
CURRENT_DATE - INTERVAL '7 days' CURRENT_DATE - 单击完成。
- 单击验证确保 SQL 查询和范围定义有效。
- 单击下一步。
- 指定唯一标识符字段、几何类型以及空间参考,然后单击完成。
现在您可以使用时间滑块导航至任意时间段并查看当时发生的地震。您可以单击禁用时间按钮查看在构建的默认时间范围内发生的地震,此示例中时间范围为最近七天。
警告:
您可针对一个查询图层声明多个范围参数,但这些范围参数中仅有一个可以引用日期时间值。
范围参数的高级属性
如果查询验证失败,您可能需要为范围参数指定一些高级属性。展开参数属性的高级部分,指定字段所属的表的名称。该操作有助于从表中直接检索最小和最大值。该操作可提高效率,在参数位于嵌套查询之内时尤其如此。同样,在高级标题下,如果未提供任何默认值,则必须指定在参数缺少值时所用的表达式。选择 1=1(默认),将参数解析为表达式中的 'TRUE',或选择 1=0,将参数解析为 'FALSE'。
离散参数
离散参数可与数值(整型或双精度型)、日期值或字符串值结合使用,并使用关键字 :: 作为前缀。这些变量与使用 SQL 运算符的字段或表达式成对出现。您可以更新字段值对绘制在地图上的数据进行过滤。
在声明离散参数时,必须指定数据类型和默认值。要提供运行时的图层中的选择列表,可使用 SQL IN 运算符并选中允许多个值。或者,还可以指定用于代替参数名称的别名。以下为示例:
- WHERE aFieldName = ::var1
- WHERE AdminField IN ::AdminAgency
预定义的离散参数
除声明您自己的离散参数外,您还可以在查询中使用两个预定义的离散参数。view_extent 参数用于指定查询的空间过滤器,并且可在处理庞大的数据集时显著提高性能。view_scale 参数可用于访问查询中的当前地图比例。这些变量仅在您处于 2D 地图环境中时才会纳入考量范围, 在 3D 场景中将忽略不计。
view_extent
在地图上查看图层时,发送到数据库的查询将已在 SQL 查询的末尾追加了空间过滤器。此设置已足够,但您可能希望仅将聚合限制为当前范围中可见的要素。在这些情况下,您可以将 view_extent 参数添加到查询以将其限制在当前空间范围内。
可以多次重复在查询中的任意位置添加 ::view_extent。与自定义离散参数不同,您无需设置属性,且参数的默认值为 NULL。
发送到数据库的 SQL 查询会在与图层相同的空间参考中将 ::view_extent 替换为可识别文本 (WKT) 格式的面。使用数据库特定函数和空间参考 ID (SRID) 从 WKT 范围面创建几何。以下示例针对 SQL Server 和 PostgreSQL 数据库类型展示了这一过程:
- 在 SQL Server 中:WHERE shape.STWithin(geometry::STGeomFromText(::view_extent, 4326)) = 1
- 在 PostgreSQL 中:WHERE ST_Within(shape, ST_GeomFromText(::view_extent, 4326))
view_scale
如果想要根据当前地图比例来更改 where 子句或所选字段,则使用 view_scale 预定义参数。使用此参数时,默认值为零。没有其他要设置的属性。您可以根据需要在 SQL 查询中多次指定此参数。以下示例使用了 SQL Server 和 PostgreSQL 数据库类型中的 view_scale 参数:
- 在 SQL Server 中:WHERE IIF(::view_scale > 100000, <do this>, <do that>)
- 在 PostgreSQL 中:WHERE (CASE WHEN ::view_scale >= 100000 THEN <do this> WHEN ::view_scale >= 50000 AND ::view_scale < 100000 THEN <do that> ELSE <do the other thing> END)
向查询图层添加参数
要向查询添加参数,需完成以下步骤:
- 右键单击内容窗格中的图层,然后单击属性。
- 在源选项卡中的查询表行中,单击编辑查询 。
该查询会在查询文本框中表示。
提示:
为了使查询文本更易于读取,可以在按住 Ctrl 键的同时向前转动鼠标滚轮,将其放大。
- 将指针置于代码内并键入 ::r:<name> 输入范围参数,或键入 ::<name> 输入离散参数。
参数将以粗体显示在 SQL 查询内,且参数旁边附有编辑按钮 。
- 单击编辑按钮可访问参数的属性。
- 设置参数属性并单击完成。
您必须定义默认值和数据类型。其他属性视情况而定。
- 在编辑查询对话框上,单击验证以确保没有错误。
- 继续设置图层的空间属性,完成时可单击完成。