Перейти к основному содержанию
Перейти к основному содержанию

Обычные функции

Существует по меньшей мере* два типа функций — обычные функции (их просто называют «функциями») и агрегатные функции. Это совершенно разные понятия. Обычные функции работают так, как если бы они применялись к каждой строке отдельно (для каждой строки результат функции не зависит от остальных строк). Агрегатные функции накапливают набор значений из различных строк (то есть зависят от всего набора строк).

В этом разделе рассматриваются обычные функции. Об агрегатных функциях см. раздел «Агрегатные функции».

Примечание

Существует третий тип функций, к которому относится функция 'arrayJoin'. Отдельно также можно упомянуть табличные функции.

Строгая типизация

В отличие от стандартного SQL, ClickHouse использует строгую типизацию. Другими словами, он не выполняет неявные преобразования типов. Каждая функция работает с определённым набором типов. Это означает, что иногда необходимо использовать функции приведения типов.

Устранение общих подвыражений

Все выражения в запросе, которые имеют одинаковое AST (одинаковое представление или один и тот же результат синтаксического разбора), считаются эквивалентными по значению. Такие выражения объединяются и выполняются один раз. Идентичные подзапросы также устраняются таким образом.

Типы результатов

Все функции возвращают одно значение как результат (не несколько значений и не отсутствие значения). Тип возвращаемого значения обычно определяется только типами аргументов, а не их значениями. Исключениями являются функция tupleElement (оператор a.N) и функция toFixedString.

Константы

Для упрощения реализации некоторые функции могут работать только с константами для части своих аргументов. Например, правый аргумент оператора LIKE должен быть константой. Почти все функции возвращают константу для константных аргументов. Исключение — функции, генерирующие случайные числа. Функция now возвращает разные значения для запросов, выполненных в разное время, но результат считается константой, поскольку константность важна только в пределах одного запроса. Константное выражение также считается константой (например, правая часть оператора LIKE может быть составлена из нескольких констант).

Функции могут быть реализованы по-разному для константных и неконстантных аргументов (выполняется разный код). При этом результаты для константы и для обычного столбца, содержащего одно и то же значение во всех строках, должны совпадать.

Обработка NULL

Функции ведут себя следующим образом:

  • Если хотя бы один из аргументов функции имеет значение NULL, результат функции также будет NULL.
  • Особое поведение, описанное отдельно в описании каждой функции. В исходном коде ClickHouse эти функции имеют UseDefaultImplementationForNulls=false.

Константность

Функции не могут изменять значения своих аргументов — любые изменения отражаются только в возвращаемом результате. Поэтому результат вычисления отдельных функций не зависит от порядка, в котором функции указаны в запросе.

Функции высшего порядка

Оператор -> и функции lambda(params, expr)

Функции высшего порядка могут принимать в качестве функционального аргумента только лямбда-функции. Чтобы передать лямбда-функцию в функцию высшего порядка, используйте оператор ->. Левая часть стрелки содержит формальный параметр, который может быть любым идентификатором, или несколько формальных параметров — любые идентификаторы в кортеже. Правая часть стрелки содержит выражение, которое может использовать эти формальные параметры, а также любые столбцы таблицы.

Примеры:

x -> 2 * x
str -> str != Referer

Лямбда-функцию, принимающую несколько аргументов, также можно передать функции высшего порядка. В этом случае функции высшего порядка передаётся несколько массивов одинаковой длины, с которыми будут сопоставляться эти аргументы.

Для некоторых функций первый аргумент (лямбда-функцию) можно опустить. В этом случае подразумевается тождественное отображение.

Пользовательские функции (UDFs)

ClickHouse поддерживает пользовательские функции. См. UDFs.