ArcGIS Online 中的标准化 SQL 函数

ArcGIS Online 要求开发人员在查询托管要素图层时使用标准化 SQL 查询。此选项使开发人员和应用程序查询托管的要素图层更为简便,并有助于防止 SQL 注入攻击。所有 ArcGIS 应用程序自动支持标准 SQL 查询。

标准化查询限制

  • 标准化查询会应用于整个组织;无法对某些图层禁用标准化查询。
  • 不同工作空间之间的连接不支持标准化查询。
  • 不支持子查询作为 where 子句,如 POP_2010 = (SELECT min(POP_2010) FROM counties
  • 也不支持数据库服务(如 Microsoft Azure SQL Database)中的查询。

ArcGIS Online 中支持哪些 SQL 函数?

如果您是一名应用程序开发人员,并且正在使用数据库特有的 where 子句语法,需要更新应用程序代码中的 where 子句以使用 ArcGIS Online 所支持的常规 SQL 语法。下表显示了支持的 SQL 函数以及每个 SQL 函数的语法。在您的应用程序中使用下列函数和语法时,ArcGIS Online 会对其进行转换,使其符合要素图层使用的数据库规范。

日期函数

函数描述

CURRENT_DATE()

以 UTC 时间返回当前日期。

客户端中显示的内容取决于您正在使用的客户端。在 ArcGIS Online 中,将以您的组织或配置文件的时区来显示日期。

CURRENT_TIME()

返回当前 UTC 日期和时间(小时、分钟、秒)。

客户端中显示的内容取决于您正在使用的客户端。在 ArcGIS Online 中,将以您的组织或配置文件的本地时间来显示时间。

CURRENT_TIMESTAMP()

返回当前 UTC 日期和时间(小时、分钟、秒、毫秒)。

客户端中显示的内容取决于您正在使用的客户端。在 ArcGIS Online 中,将以您的组织或配置文件的本地时间来显示时间。

EXTRACT(<unit> FROM <date>)

返回指定 <unit> 的单一部分 (<date>)。可能的 <unit> 值包括但不限于年、月、日、小时和分钟。

示例

  • EXTRACT(MONTH FROM 12/21/2016) - 返回 12。
  • EXTRACT(DAY FROM 12/21/2016 12:00) - 返回 21。
  • EXTRACT(HOUR FROM 12/21/2016 15:00) - 返回 15。

数值函数

函数描述

ABS(<number>)

返回所指定数值的绝对(正)值。

CEILING(<number>)

返回大于或等于指定数值的最小整数。

示例

  • CEILING(12.93) - 结果为 13。

COS(<number>)

返回 <number>(假设其为以弧度为单位的角)的三角余弦值。

CAST(<number>AS FLOAT | INT)

将 number 转换为其他类型。FLOAT 将指定数值转换为双精度型,并 INT 将其转换为整型。

FLOOR(<number>)

返回小于或等于指定数值的最大整数。

示例

  • FLOOR(12.93) - 结果为 12。

LOG(<number>)

指定数值的自然对数。

LOG10(<number>)

指定数值以 10 为底的对数。

MOD(<number>, <n>)

返回被除数 (<number>) 除以除数 <n> 后的余数。<n> 和 <number> 必须均为整型。

示例包括以下内容:

  • MOD(10, 4) - 结果为 2。
  • MOD(CAST(DBLFIELD AS INT), 4) - DBLFIELD 是双精度型字段,所以需使用 CAST 函数将值从双精度型转换为整型。

NULLIF(<number>, <value>)

若指定数值等于指定值,则返回 nullNULLIF 通常用于防止出现因将 <value> 设置为 0 而产生的除数为零的错误。

只要计算中任意参数出现 null 字段值,计算结果即为 null

例如,假设您需要将一个双精度字段的值换算成 TOTALPOP 除以 POP18。 如果任意要素的 POP18 值等于零,则计算将引发一个除数为零的错误。您可以创建一个过滤器来隐藏 POP18 为零的那些记录,然后执行计算。也可以使用捷径 NULLIF

  • TOTALPOP / NULLIF(POP18, 0) - 如果 POP18 等于 0,则返回 null;否则,返回 TOTALPOP / POP18 的值。

POWER(<number> , <y>)

返回指定数值的指定幂的值 (<y>)。

ROUND(<number> , <length>)

将所指定数值四舍五入至指定长度。

如果 <length> 使用正数,则数值将舍入到由 <length> 指定的小数位。如果 <length> 为负数,则指定的 <number> 将舍入到小数点左侧的相应位置。

示例

  • ROUND(10.9934,2) - 返回 10.99。
  • ROUND(10.9964,2) - 返回 11.00。
  • ROUND(111.0,-2) - 返回 100.00。

SIN(<number>)

返回指定 <number>(假设其为以弧度为单位的角)的三角正弦值。

TAN(<number>)

返回指定 <number>(假设其为以弧度为单位的角)的正切值。

TRUNCATE(<number>,<decimal_place>)

在指定 <decimal_place> 处截断 <number>

正的 <decimal_place> 将截断至指定的小数位。若 <decimal_place> 为负数,将在小数点左侧的相应位置截断 <number>

示例

  • TRUNCATE(111.996,2) - 返回 111.99。
  • TRUNCATE(111.996,-2) - 返回 100.00。

字符串函数

函数描述

CHAR_LENGTH(<string>)

返回指定字符串的字符数。结果为整数。

示例

  • CHAR_LENGTH('Redlands') - 结果为 8。

CONCAT(<string1>, <string2>)

连接两个字符串值。

只能提供两个字符串。要连接两个以上的字符串,需嵌套连续的 CONCAT 函数,如下所示。

示例

  • CONCAT('A', 'B') - 结果为 'AB'
  • CONCAT('A', CONCAT(':', 'B')) - 结果为 'A:B'

空值会转换成空字符串。

POSITION(<substring>, <string>)

返回所指定字符串中指定子字符串第一次出现时的位置。如果没有找到指定的子字符串,则结果为 0。

示例

  • POSITION('boat', 'Sailboat') - 结果为 5。
  • POSITION('motor', 'Sailboat') - 结果为 0。

SUBSTRING(<string>, <start>, <length>)

返回部分字符串值;<start> 是一个整数索引,用于指定所返回字符的起始位置,<length> 则为返回的字符数。

示例

  • SUBSTRING('Sailboat', 5, 4) - 结果为 'boat'
  • SUBSTRING('Sailboat', 1, 4) - 结果为 'Sail'
  • SUBSTRING('Sailboat', 5, 100) - 结果为 'boat'

TRIM(BOTH | LEADING | TRAILING ' ' FROM <string>)

返回从所指定字符串中移除所有前导或尾随空格后的字符串。

示例

  • TRIM(BOTH ' ' FROM ' San Bernardino ') - 结果为 'San Bernardino'

请注意,第二个参数是由空格连接的两个单引号。

UPPER(<string>)

返回所有字符转换成大写后的字符串。

示例

  • UPPER('Sailboat') - 结果为 'SAILBOAT'

LOWER(<string>)

返回所有字符转换成小写后的字符串。

示例

  • LOWER('Sailboat') - 结果为 'sailboat'