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