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