ArcGIS Online 中的标准化 SQL 函数

ArcGIS Online 要求开发人员在查询托管要素图层时使用标准化 SQL 查询。 使用标准化 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>)

返回指定 <date> 的单个部分 (<unit>)。 可能的 <unit> 值包括但不限于 yearmonthdayhourminute

以下示例从日期时间值 2016-12-21 15:11 中提取不同的单位:

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

数值函数

函数描述

ABS(<number>)

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

CAST(<number> AS FLOAT | INT)

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

在以下示例中,数字被转换为整数。 因为整数是整数,所以结果是 1424。 在第二个示例中,整数被转换为浮点数,结果为带有小数的数字 1424.0

  • CAST(1424.49 AS INT)
  • CAST(1424 AS FLOAT

CEILING(<number>)

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

以下示例返回 13:

CEILING(12.93)

COS(<number>)

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

FLOOR(<number>)

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

以下示例返回 12:

FLOOR(12.93)

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>)。

以下示例返回 32768:

POWER(8,5)

ROUND(<number> , <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>

在第一个示例中,小数点右边的数字被截断为仅包含两个数字,因此结果为值 111.99。 在第二个示例中,小数点左边的数字被截断,结果为值 100.00。

  • TRUNCATE(111.996,2)
  • TRUNCATE(111.996,-2)

字符串函数

函数描述

CAST(<string> AS DATE | TIME)

如果字符串值采用受支持的格式,则将字符串转换为日期或时间。

如果字符串的格式为“MM/DD/YYYY hh:MM:ss”或“YYYY-MM-DD”,则可以将其转换为日期。 如果字符串的格式为“HH:MM:SS”,则可以将其转换为仅时间数据类型 (TIME)。

例如,可以将以下字符串转换为日期:

CAST('1988-05-30' AS DATE)

CHAR_LENGTH(<string>)

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

例如,以下语句返回 8:

CHAR_LENGTH('Redlands')

CONCAT(<string1>, <string2>)

连接两个字符串值。

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

以下第一个示例连接字母 A 和 B。 第二个示例显示嵌套 CONCAT 函数用于连接三个字符串值 A、: 和 B。

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

空值会转换成空字符串。

CURRENT_USER

CURRENT_USER 函数包含在查询中时,其作用类似于变量;访问托管要素图层或托管要素图层视图的用户的用户名在查询中识别和使用。

例如,如果用户 planner3 登录到组织以访问包含以下查询定义的托管要素图层视图,则只有 staffmember 字段包含值 planner3 的要素返回到连接用户:

staffmember=current_user

在下一示例中,staffmember 字段中存储了多个值。 即使字段中存储了多个用户名,以下 where 子句也会在 staffmember 字段的文本值中查找当前用户名:

where=position(current_user in staffmember)>0

POSITION(<substring>, <string>)

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

在下面的第一个示例中,结果是 5,因为子字符串 (boat) 的第一个字母 (b) 是字符串 (Sailboat) 中的第五个字母。 在第二个示例中,结果为 0,因为字符串中不存在子字符串 (motor)。

  • POSITION('boat', 'Sailboat')
  • POSITION('motor', 'Sailboat')

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>)

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

在以下示例中,字符串 San Bernardino 前后均有一个空格。 关键字 BOTH 用于从文本字符串的开始和结束处修剪空格字符串(用两个单引号表示,中间有一个空格):

TRIM(BOTH ' ' FROM ' San Bernardino ')

这将返回字符串 'San Bernardino'

UPPER(<string>)

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

在此示例中,字符串 Sailboat 中的所有字母均转换为大写,从而得到字符串 'SAILBOAT'

UPPER('Sailboat')

LOWER(<string>)

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

在下一示例中,返回 'sailboat'

LOWER('Sailboat')