定义查询图层中的参数
定义 查询图层 源的 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' DAYtrunc(CURRENT_DATE)PostgreSQL
CURRENT_DATE - INTERVAL '7 days'CURRENT_DATE单击 完成 。
单击 验证 确保 SQL 查询和范围定义有效。
单击 下一步 。
指定 唯一标识符字段 、 几何类型 以及 空间参考 ,然后单击 完成 。
现在您可以使用时间滑块导航至任意时间段并查看当时发生的地震。 您可以单击 禁用时间 按钮
查看在构建的默认时间范围内发生的地震,此示例中时间范围为最近七天。
注意:
您可针对一个查询图层声明多个范围参数,但这些范围参数中仅有一个可以引用日期时间值。
范围参数的高级属性
如果查询验证失败,您可能需要为范围参数指定一些高级属性。 展开参数属性的 高级 部分,指定字段所属的表的名称。 该操作有助于从表中直接检索最小和最大值。 该操作可提高效率,在参数位于嵌套查询之内时尤其如此。 同样,在 高级 标题下,如果未提供任何默认值,则必须指定在参数缺少值时所用的表达式。 选择 1=1 (默认),将参数解析为表达式中的 'TRUE' ,或选择 1=0 ,将参数解析为 'FALSE' 。
离散参数
离散参数可与数值(整型或双精度型)、日期值或字符串值结合使用,并使用关键字 :: 作为前缀。 这些参数与使用 SQL 运算符的字段或表达式成对出现。 您可以 更新字段值 对绘制在地图上的数据进行过滤。
在声明离散参数时,必须指定数据类型和默认值。 要提供运行时的图层中的选择列表,可使用 SQL IN 运算符并选中 允许多个值 。 或者,还可以指定用于代替参数名称的别名。 以下为示例:
WHERE aFieldName = ::var1WHERE 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 查询内,且参数旁边附有 编辑 按钮
。单击 编辑 按钮可访问参数的属性。
设置参数属性并单击 完成 。
您必须定义 默认值 和 数据类型 。 其他属性视情况而定。
在 编辑查询 对话框上,单击 验证 以确保没有错误。
继续设置图层的空间属性,完成时可单击 完成 。