定义查询图层源的 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 查询进行定义。 您可使用创建查询图层地理处理工具创建查询图层,但无法使用此工具定义参数。 要在 SQL 语句中使用参数,请在编辑查询对话框中更改查询图层。
如果需要查询图层以按日期、时间或数值范围浏览聚合值,则使用创建聚合查询图层地理处理工具构建启用动态聚合的查询图层,并定义查询参数以显示结果。
范围参数
范围参数可与数值(整型或双精度型)或日期时间值结合使用,以在时间或范围滑块上动态显示数据。 该参数可在没有引用字段或表达式的情况下进行声明,同时 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 查询内,且参数旁边附有编辑按钮 。
- 单击编辑按钮可访问参数的属性。
- 设置参数属性并单击完成。
您必须定义默认值和数据类型。 其他属性视情况而定。
- 在编辑查询对话框上,单击验证以确保没有错误。
- 继续设置图层的空间属性,完成时可单击完成。