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

Регулярные функции

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

В этом разделе мы обсуждаем регулярные функции. Для агрегатных функций смотрите раздел "Агрегатные функции".

примечание

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

Декомпозиция выражений

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

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

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

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

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

Константы

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

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

Обработка NULL

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

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

Постоянство

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

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

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

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

Примеры:

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

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

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

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

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