Skip to content
ClickHouse Docs
ClickHouse DocsClickHouse Docs

eval

Табличная функция eval вычисляет свой аргумент в строку запроса, а затем выполняет её как один SELECT-запрос.

Эта табличная функция является экспериментальной и по умолчанию отключена. Чтобы включить её, используйте настройку allow_experimental_eval_table_function:

SET allow_experimental_eval_table_function = 1;

Для этого также нужен анализатор (enable_analyzer, который по умолчанию включен).

Синтаксис

eval(expression)
eval(SELECT ...)

Аргументы

  • expression — Константное выражение, возвращающее строку запроса. Допускаются параметры запроса и скалярные подзапросы.
  • SELECT ... — Запрос SELECT, возвращающий строку запроса. Эта форма представляет собой синтаксический сахар для скалярного подзапроса: eval(SELECT ...) эквивалентно eval((SELECT ...)), поэтому запрос должен возвращать ровно одну строку и один столбец.

Значение выражения должно иметь один из следующих типов:

  • String
  • Nullable(String)
  • LowCardinality(String)
  • LowCardinality(Nullable(String))

Если значение равно NULL, eval генерирует исключение.

Возвращаемое значение

Возвращает результат сгенерированного запроса SELECT в виде таблицы.

Схема выходных данных определяется при анализе табличной функции eval, поэтому внешние запросы могут ссылаться на реальные имена столбцов и типы сгенерированного запроса.

Примеры

Вычислите константное выражение:

SELECT * FROM eval('SEL' || 'ECT 1 AS x');

Результат:

┌─x─┐
│ 1 │
└───┘

Используйте параметр запроса:

SET param_q = 'SELECT 2 AS y';
SELECT * FROM eval({q:String});

Результат:

┌─y─┐
│ 2 │
└───┘

Выполняет входной SELECT-запрос и возвращает текст запроса:

SELECT * FROM eval(SELECT 'SELECT 3 AS z');

Результат:

┌─z─┐
│ 3 │
└───┘

Используйте созданную схему во внешнем запросе:

SELECT x + 1 FROM eval('SELECT 4 AS x');

Результат:

┌─plus(x, 1)─┐
│          5 │
└────────────┘

Ограничения

  • eval работает только с анализатором запросов (enable_analyzer = 1).
  • Сгенерированный запрос должен представлять собой один запрос SELECT без предложений вывода, таких как INTO OUTFILE или FORMAT. eval не выполняет несколько операторов.
  • Сгенерированный запрос должен быть самодостаточным: он обрабатывается в собственной области видимости и не может ссылаться на псевдонимы WITH или столбцы внешнего запроса.
  • Сгенерированный запрос не может повторно использовать табличную функцию eval.
  • eval нельзя использовать в качестве аргумента другой табличной функции, например remote('host', eval(...)). Чтобы выполнить сгенерированный запрос на удалённом сервере, оберните его в view: remote('host', view(SELECT * FROM eval(...))).
  • Аргумент вычисляется один раз при анализе запроса, а не отдельно для каждой строки или блока.
  • Во внешнем журнале запросов записывается исходный запрос, содержащий eval; сгенерированный запрос SELECT не записывается как отдельный пользовательский запрос.
Navigation