Skip to content
ClickHouse Docs
ClickHouse DocsClickHouse Docs

eval

eval 表函数会先将其参数求值为查询字符串,然后将该字符串作为单条 SELECT 查询执行。

此表函数处于 Experimental 阶段,默认已禁用。使用 allow_experimental_eval_table_function 设置启用它:

SET allow_experimental_eval_table_function = 1;

它还需要 analyzer (enable_analyzer,默认启用) 。

语法

eval(expression)
eval(SELECT ...)

参数

  • expression — 返回查询字符串的常量表达式。允许使用查询参数和标量子查询。
  • SELECT ... — 返回查询字符串的 SELECT 查询。这种形式是标量子查询的语法糖:eval(SELECT ...) 等同于 eval((SELECT ...)),因此该查询必须恰好返回一行一列。

该表达式的值必须是以下类型之一:

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

如果该值为 NULLeval 会抛出异常。

返回值

将生成的 SELECT 查询结果以表的形式返回。

输出 schema 会在分析 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 │
└───┘

在外层查询中使用生成的 schema:

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

结果:

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

限制

  • eval 仅在启用查询分析器 (enable_analyzer = 1) 时可用。
  • 生成的查询必须是单个 SELECT 查询,且不能包含 INTO OUTFILEFORMAT 等输出选项。eval 不执行多条语句。
  • 生成的查询必须是自包含的:它会在自身的作用域内解析,不能引用外层查询的 WITH 别名或列。
  • 生成的查询不能再次使用 eval 表函数。
  • eval 不能用作其他表函数的参数,例如 remote('host', eval(...))。若要在远程服务器上执行生成的查询,请将其包装在 view 中:remote('host', view(SELECT * FROM eval(...)))
  • 该参数会在查询分析阶段求值一次,而不是对每一行或每个块求值一次。
  • 外层查询日志会记录包含 eval 的原始查询;生成的 SELECT 查询不会作为单独的用户查询被记录。
Navigation