Арифметические операторы (+, -, *, ...)
Арифметические операторы создают свойства, значением которых является результат арифметической операции. В основном они работают со значениями числовых классов. Кроме того, сумма и разность работают также со значениями даты/времени (описано ниже), а сумма ещё и конкатенирует строки (см. Строковые операторы). В платформе на данный момент поддерживаются следующие арифметические операторы:
| Оператор | Название | Описание | Пример | Результат |
|---|---|---|---|---|
+ | Сумма | Принимает два операнда на вход и возвращает их сумму | 3 + 5 | 8 |
- | Разность | Принимает два операнда на вход и возвращает их разность Также у этого оператора есть унарная форма, в этом случае первый операнд считается равным 0 | 5 - 3 | 2 |
* | Произведение | Принимает два операнда на вход и возвращает их произведение | 3 * 5 | 15 |
/ | Отношение | Принимает два операнда на вход и возвращает их отношение | 15 / 3 | 5 |
Все эти операторы возвращают NULL, если один из операндов NULL. Деление на ноль также возвращает NULL. Для операторов суммы и разности также есть возможность использовать специальную форму со скобками, в этом случае NULL будет эквивалентен 0. Причем для этих операторов будет верно и обратное - если результат оператора в такой форме равен 0, то возвращается NULL (к примеру 5 (-) 5 = NULL):
| Оператор | Название | Описание | Пример | Результат |
|---|---|---|---|---|
(+) | Сумма | Принимает два операнда на вход, возвращает их сумму, трактует NULL как 0 | 3 (+) 53 (+) NULL | 83 |
(-) | Разность | Принимает два операнда на вход, возвращает их разность, трактует NULL как 0 | 5 (-) 35 (-) NULL5 (-) 5 | 25NULL |
Остаток от деления, целочисленное деление и возведение в степень отдельными операторами не представлены — их выполняют свойства системного модуля Utils:
| Операция | Свойство | Описание | Пример | Результат |
|---|---|---|---|---|
| Остаток от деления | mod[…, …] | Принимает два операнда на вход и возвращает остаток от деления первого на второй; знак результата совпадает со знаком делимого. При нулевом делителе не возвращает NULL, а завершается ошибкой СУБД | mod(-7, 2) | -1 |
| Целочисленное деление | divideInteger[…, …] | Приводит оба операнда к INTEGER (нецелые значения округляются) и возвращает их отношение — целочисленное, с отбрасыванием дробной части | divideInteger(7, 2) | 3 |
| Возведение в степень | power[…, …] | Принимает два операнда на вход и возвращает первый в степени второго; результат — DOUBLE | power(2, 3) | 8 |
Определение класса результата
Класс результата определяется как:
| Оператор | Результат |
|---|---|
+, - | Общий предок (семейство - Числа) |
* | NUMERIC[p1.IntegerPart + p1.Precision + p2.IntegerPart + p2.Precision, p1.Precision + p2.Precision] |
/ | NUMERIC[p1.IntegerPart + p2.Precision + s, s] |
Формулы NUMERIC[ , ] для произведения и отношения применяются, только если хотя бы один операнд принадлежит NUMERIC[ , ]; в противном случае результатом является общий предок (семейство - Числа) двух классов операндов, поэтому произведение или отношение двух целых чисел само является целым числом — отношение при этом является целочисленным делением (с отбрасыванием дробной части). В формуле отношения s — это максимальная шкала NUMERIC (32 по умолчанию).
Сумма и разность также работают со значениями даты/времени, где целое число отсчитывается в базовых единицах — днях для DATE, секундах для DATETIME, ZDATETIME и TIME:
| Операнды | Результат |
|---|---|
значение даты/времени + / - целое число | тот же класс даты/времени |
DATE - DATE | INTEGER (число дней) |
DATETIME / ZDATETIME / TIME - значение того же класса | LONG (число базовых единиц) |
Если хотя бы один операнд оператора + принадлежит строковому классу, результатом является строковый класс; его длина, регистронезависимость и остальные параметры определяются по правилам объединения строк — см. строковые операторы.
Язык
Описание арифметических операторов.
Примеры
sum(a, b) = a + b;
transform(a, b, c) = -a * (b (+) c);
remainder(a, b) = mod(a, b); // остаток от деления — свойство модуля Utils