Обычные функции
Существует как минимум* два типа функций - обычные функции (которые просто называются "функциями") и агрегирующие функции. Это совершенно разные концепции. Обычные функции работают так, как если бы они применялись к каждой строке отдельно (для каждой строки результат функции не зависит от других строк). Агрегирующие функции накапливают набор значений из различных строк (т.е. они зависят от всего набора строк).
В этом разделе мы обсуждаем обычные функции. Для агрегирующих функций смотрите раздел "Агрегирующие функции".
Существует третий тип функции, к которому относится функция 'arrayJoin'. А табличные функции также можно упомянуть отдельно.
Сильная типизация
В отличие от стандартного SQL, ClickHouse имеет сильную типизацию. Другими словами, он не выполняет неявные преобразования между типами. Каждая функция работает для конкретного набора типов. Это значит, что иногда необходимо использовать функции преобразования типов.
Устранение общих подвыражений
Все выражения в запросе, которые имеют одинаковое AST (одинаковую запись или одинаковый результат синтаксического разбора), считаются имеющими идентичные значения. Такие выражения конкатенируются и выполняются один раз. Таким образом также устраняются идентичные подзапросы.
Типы результатов
Все функции возвращают единственное значение в качестве результата (не несколько значений и не ноль значений). Тип результата обычно определяется только типами аргументов, а не их значениями. Исключения составляют функция tupleElement (оператор a.N) и функция toFixedString.
Константы
Для упрощения некоторые функции могут работать только с константами для некоторых аргументов. Например, правый аргумент оператора LIKE должен быть константой. Практически все функции возвращают константу для константных аргументов. Исключение составляют функции, генерирующие случайные числа. Функция 'now' возвращает разные значения для запросов, которые выполнялись в разное время, но результат считается константой, так как постоянство имеет значение только в пределах одного запроса. Константное выражение также считается константой (например, правая половина оператора LIKE может быть сконструирована из нескольких констант).
Функции могут быть реализованы по-разному для константных и неконстантных аргументов (выполняется различный код). Но результаты для константы и для истинной колонки, содержащей только одно и то же значение, должны совпадать.
Обработка NULL
Функции имеют следующие поведения:
- Если хотя бы один из аргументов функции
NULL
, то результат функции такжеNULL
. - Специальное поведение, которое указано индивидуально в описании каждой функции. В исходном коде ClickHouse эти функции имеют
UseDefaultImplementationForNulls=false
.
Постоянство
Функции не могут изменять значения своих аргументов – любые изменения возвращаются как результат. Таким образом, результат вычисления отдельных функций не зависит от порядка, в котором эти функции записаны в запросе.
Функции высшего порядка
Оператор ->
и функции lambda(params, expr)
Функции высшего порядка могут принимать только лямбда-функции в качестве своего функционального аргумента. Чтобы передать лямбда-функцию функции высшего порядка, используйте оператор ->
. Левая сторона стрелки имеет формальный параметр, который представляет собой любой идентификатор, или несколько формальных параметров – любые идентификаторы в кортеже. Правая сторона стрелки содержит выражение, которое может использовать эти формальные параметры, а также любые колонки таблицы.
Примеры:
Лямбда-функцию, которая принимает несколько аргументов, также можно передать функции высшего порядка. В этом случае функции высшего порядка передаются несколько массивов одинаковой длины, что соответствует этим аргументам.
Для некоторых функций первый аргумент (лямбда-функция) может быть опущен. В этом случае предполагается идентичное отображение.
Пользовательские функции (UDF)
ClickHouse поддерживает пользовательские функции. См. UDF.