Табличная функция eval вычисляет свой аргумент в строку запроса, а затем выполняет её как один запрос SELECT.
Эта табличная функция является экспериментальной и по умолчанию отключена. Чтобы включить её, используйте настройку allow_experimental_eval_table_function:
Для этого также нужен анализатор (enable_analyzer, который по умолчанию включен).
expression — Константное выражение, возвращающее строку запроса. Допускаются параметры запроса и скалярные подзапросы.
SELECT ... — Запрос SELECT, возвращающий строку запроса. Эта форма представляет собой синтаксический сахар для скалярного подзапроса: eval(SELECT ...) эквивалентно eval((SELECT ...)), поэтому запрос должен возвращать ровно одну строку и один столбец.
Значение выражения должно иметь один из следующих типов:
String
Nullable(String)
LowCardinality(String)
LowCardinality(Nullable(String))
Если значение равно NULL, eval генерирует исключение.
Возвращает результат сгенерированного запроса SELECT в виде таблицы.
Схема выходных данных определяется при анализе табличной функции eval, поэтому внешние запросы могут ссылаться на реальные имена столбцов и типы сгенерированного запроса.
Вычислите константное выражение:
Результат:
Используйте параметр запроса:
Результат:
Выполняет входной SELECT-запрос и возвращает текст запроса:
Результат:
Используйте созданную схему во внешнем запросе:
Результат:
eval работает только с анализатором запросов (enable_analyzer = 1).
- Сгенерированный запрос должен представлять собой один запрос
SELECT без предложений вывода, таких как INTO OUTFILE или FORMAT. eval не выполняет несколько операторов.
- Сгенерированный запрос должен быть самодостаточным: он обрабатывается в собственной области видимости и не может ссылаться на псевдонимы
WITH или столбцы внешнего запроса.
- Сгенерированный запрос не может повторно использовать табличную функцию
eval.
eval нельзя использовать в качестве аргумента другой табличной функции, например remote('host', eval(...)). Чтобы выполнить сгенерированный запрос на удалённом сервере, оберните его в view: remote('host', view(SELECT * FROM eval(...))).
- Аргумент вычисляется один раз при анализе запроса, а не отдельно для каждой строки или блока.
- Во внешнем журнале запросов записывается исходный запрос, содержащий
eval; сгенерированный запрос SELECT не записывается как отдельный пользовательский запрос.
Последнее изменение 23 июля 2026 г.