Арифметические функции

Для всех арифметических функций в RQL тип результата вычисляется как минимальный числовой тип, который может вместить результат, если такой тип существует. Выбор минимального типа происходит с учетом числа бит, знаковости и наличия плавающей точки. Если минимальных бит не хватает, то используется тип с максимальной битностью.

Примеры использования:

SELECT toTypeName(0), toTypeName(0 + 0), toTypeName(0 + 0 + 0), toTypeName(0 + 0 + 0 + 0)
Визуализация ожидаемого результата запроса
toTypeName(0) toTypeName(plus(0, 0)) toTypeName(plus(plus(0, 0), 0)) toTypeName(plus(plus(plus(0, 0), 0), 0))

UInt8

UInt16

UInt32

UInt64

Арифметические функции работают для любой пары типов из UInt8, UInt16, UInt32, UInt64, Int8, Int16, Int32, Int64, Float32, Float64. Переполнение обрабатывается аналогично C++.

Использование функций multiplyDecimal и divideDecimal предпочтительнее в ситуациях, когда необходима высокая точность вычислений и контроль за размером дробной части. В то же время следует учитывать, что эти функции могут работать медленнее стандартных арифметических функций multiply и divide.

Набор поддерживаемых функций RQL и их поведение зависят от версии установленного ClickHouse. Если функция не поддерживается в используемой версии ClickHouse, она также не будет доступна в RQL.

Ознакомиться с актуальным списком функций и их поведением можно в официальной документации ClickHouse.

Обратите внимание, что для функций в официальной документации ClickHouse может быть указана версия, в которой эти функции были введены. Это позволит определить, доступна ли рассматриваемая функция в вашей версии ClickHouse.

Арифметические функции
Функция Описание

abs(x)

Возвращает абсолютное значение числа x. Для беззнаковых типов ничего не изменяет.

byteSwap(x)

Переставляет байты целого числа x в обратном порядке и возвращает полученное число того же типа.

divide(x, y)

Вычисляет частное чисел x и y. Результат всегда с плавающей запятой. При делении на ноль возвращает inf, -inf или NaN. Для целочисленного деления используйте intDiv.

divideDecimal(x, y[, result_scale])

Делит два десятичных числа x и y. Результирующее значение будет типа Decimal256. Масштаб результата может быть явно задан аргументом result_scale (целое число в диапазоне [0, 76]). Если не задан, масштаб результата равен максимальному масштабу среди переданных аргументов.

divideOrNull(x, y)

Аналогично divide, но возвращает NULL при делении на ноль.

gcd(x, y)

Вычисляет наибольший общий делитель целых чисел x и y. Генерирует исключение при делении на ноль или при делении минимального отрицательного числа выбранного типа на -1.

ifNotFinite(x, y)

Проверяет, является ли число x с плавающей запятой конечным. Возвращает x, если x — конечное число, иначе — возвращает значение по умолчанию y.

intDiv(x, y)

Вычисляет целочисленное частное чисел x и y с округлением вниз. Результат имеет ту же разрядность, что и x. Генерирует исключение при делении на ноль, при выходе результата за границы диапазона типа x или при делении минимального отрицательного числа выбранного типа на -1.

intDivOrNull(x, y)

Аналогично intDiv, но возвращает NULL при делении на ноль или при делении минимального отрицательного числа на -1.

intDivOrZero(x, y)

Аналогично intDiv, но возвращает 0 при делении на ноль или при делении минимального отрицательного числа на -1.

isFinite(x)

Проверяет, является ли число x типа Float32 или Float64 конечным. Возвращает 1, если x конечно и не равно NaN, иначе — 0.

isInfinite(x)

Проверяет, является ли число x типа Float32 или Float64 бесконечным. Возвращает 1, если x бесконечно, иначе — 0 (включая случай NaN).

isNaN(x)

Проверяет, является ли число x типа Float32 или Float64 значением NaN. Возвращает 1, если x равен NaN, иначе — 0.

lcm(x, y)

Вычисляет наименьшее общее кратное для целых значений x и y. Генерирует исключение при делении на ноль или при делении минимального отрицательного числа выбранного типа на -1.

max2(value1, value2)

Сравнивает числа value1 и value2, возвращая максимальное значение. Результат приводится к Float64.

min2(value1, value2)

Сравнивает числа value1 и value2, возвращая минимальное значение. Результат приводится к Float64.

minus(x, y)

Вычисляет разность чисел x и y. Помимо вычитания между числами, поддерживает вычитание целых чисел из даты и даты со временем, а также вычитание между датами со временем. Результат операции зависит от типов данных x и y.

modulo(x, y)

mod(x, y)

Вычисляет остаток от деления числа x на y. Тип результата — целое число, если оба аргумента являются целыми. Если один из аргументов — число с плавающей запятой, тип результата — Float64. Генерирует исключение при делении на ноль или при делении минимального отрицательного числа выбранного типа на -1.

moduloLegacy(x, y)

Вычисляет остаток от деления числа x на y. Использует старую реализацию оператора %, из-за чего для отрицательных чисел могут получаться отрицательные результаты. Существует для обратной совместимости с функциями более старых версий ClickHouse. Для стандартного поведения используйте modulo или positiveModulo.

moduloOrNull(x, y)

modOrNull(x, y)

Аналогично функции modulo, но возвращает NULL при делении на ноль.

moduloOrZero(x, y)

Аналогично функции modulo, но возвращает 0 при делении на ноль.

multiply(x, y)

Вычисляет произведение чисел x и y.

multiplyDecimal(x, y[, result_scale])

Выполняет умножение двух десятичных чисел x и y. Результат имеет тип Decimal256. Масштаб результата может быть явно задан аргументом result_scale (целое число в диапазоне [0, 76]). Если result_scale не задан, масштаб результата равен максимальному масштабу среди переданных аргументов.

negate(x)

Меняет знак у числа x и возвращает полученное число.

plus(x, y)

Вычисляет сумму чисел x и y. Помимо сложения чисел, поддерживает сложение целых чисел с датой и датой со временем, а также сложение даты и времени. Результат операции зависит от типов данных x и y.

positiveModulo(x, y)

pmod(x, y)

positive_modulo(x, y)

Аналогично функции modulo, но всегда возвращает неотрицательное число.

positiveModuloOrNull(x, y)

pmodOrNull(x, y)

positive_modulo_or_null(x, y)

Аналогично функции positiveModulo, но возвращает NULL, если правый аргумент равен 0.

Была ли полезна эта страница?

Обратная связь