Стандартизованные SQL-функции в ArcGIS Online

ArcGIS Online требует, чтобы разработчики использовали стандартизированные SQL-запросы при работе с размещенными векторными слоями. Использование стандартизированных SQL-запросов помогает предотвратить SQL-вторжения. Все приложения ArcGIS поддерживают стандартизированные SQL-запросы.

Ограничения стандартизированных запросов

  • Стандартизированные запросы применяются ко всей организации и не могут быть отключены для отдельных слоев.
  • Стандартизированные запросы не поддерживаются в соединениях между различными рабочими областями.
  • Подзапросы, такие как условие where, например, POP_2010 = (SELECT min(POP_2010) FROM counties, не поддерживаются.
  • Запросы от сервисов базы данных, например, Microsoft Azure SQL Database, не поддерживаются.

Функции SQL, которые поддерживаются в ArcGIS Online

Если вы разработчик приложений и в настоящее время используете синтаксис условия where, специфичный для базы данных, вам необходимо обновить условия where в коде вашего приложения, чтобы использовать общий синтаксис SQL, поддерживаемый ArcGIS Online. В следующих таблицах приведены поддерживаемые 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> включают, в том числе: year, month, day, hour и minute.

В следующих примерах извлекаются различные единицы из значения даты и времени 21.12.2021 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)

Конвертирует число в другой тип. 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>)

Десятичный логарифм указанного числа.

MOD(<number>, <n>)

Возвращает остаток после деления делимого (<number>) на делитель <n>. <n> и <number> должны быть целочисленными.

Примеры:

  • MOD(10, 4) – результат равен 2.
  • MOD(CAST(DBLFIELD AS INT), 4) – – это поDBLFIELDле типа с двойной точностью, поэтому для конвертации значений из двойных в целые необходима функция CAST.

NULLIF(<number>, <value>)

Возвращает null, если указанное число равно заданному значению. NULLIF обычно используется, чтобы избежать ошибок деления на ноль в случае, когда для <value> задано 0.

Каждый раз, когда в вычислении встречается значение поля null в любом из его аргументов, результатом вычисления будет null.

Предположим, вам нужно вычислить поле double, которое TOTALPOP делится на POP18. Если любой объект имеет значение POP18, равное нулю, такое вычисление приведет к ошибке деления на ноль. Вы можете создать фильтр, чтобы скрыть записи, где значение равноPOP18 нулю, а затем выполнить необходимые вычисления. Более легкий способ - использовать NULLIF:

TOTALPOP / NULLIF(POP18, 0) – возвращает null, если POP18 равно нулю; в противном случае возвращается значение 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>)

Сокращает <number> до указанной <decimal_place>.

Положительное значение <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'.

Значения Null конвертируются в пустую строку.

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, потому что первая буква (b) подстроки (boat) является пятой буквой в строке (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')