Skip to main content
eval 表函数会先将其参数求值为查询字符串,然后将该字符串作为单条 SELECT 查询执行。 此表函数处于 Experimental 阶段,默认已禁用。使用 allow_experimental_eval_table_function 设置启用它:
它还需要 analyzer (enable_analyzer,默认启用) 。

语法

参数

  • expression — 返回查询字符串的常量表达式。允许使用查询参数和标量子查询。
  • SELECT ... — 返回查询字符串的 SELECT 查询。这种形式是标量子查询的语法糖:eval(SELECT ...) 等同于 eval((SELECT ...)),因此该查询必须恰好返回一行一列。
该表达式的值必须是以下类型之一:
  • String
  • Nullable(String)
  • LowCardinality(String)
  • LowCardinality(Nullable(String))
如果该值为 NULLeval 会抛出异常。

返回值

将生成的 SELECT 查询结果以表的形式返回。 输出 schema 会在分析 eval 表函数时确定,因此外层查询可以引用生成查询的实际列名和类型。

示例

计算一个常量表达式:
结果:
使用查询参数:
结果:
对一个返回查询文本的输入 SELECT 查询求值:
结果:
在外层查询中使用生成的 schema:
结果:

限制

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