跳到主要内容
跳到主要内容

条件函数

if

执行条件分支。

如果条件 cond 的值评估为非零,函数返回表达式 then 的结果。 如果 cond 的值评估为零或 NULL,则返回 else 表达式的结果。

设置 short_circuit_function_evaluation 控制是否使用短路评估。如果启用,then 表达式仅在 condtrue 的行上进行评估,而 else 表达式仅在 condfalse 的行上进行评估。例如,使用短路评估时,执行查询 SELECT if(number = 0, 0, intDiv(42, number)) FROM numbers(10) 时不会抛出除以零的异常。

thenelse 必须是类似类型。

语法

别名: cond ? then : else (三元操作符)

参数

  • cond – 被评估的条件。 UInt8、Nullable(UInt8) 或 NULL。
  • then – 如果 condition 为 true 时返回的表达式。
  • else – 如果 condition 为 false 或 NULL 时返回的表达式。

返回值

根据条件 cond 返回 thenelse 表达式的结果。

示例

结果:

multiIf

允许在查询中更简洁地编写 CASE 操作符。

语法

设置 short_circuit_function_evaluation 控制是否使用短路评估。如果启用,then_i 表达式仅在 ((NOT cond_1) AND (NOT cond_2) AND ... AND (NOT cond_{i-1}) AND cond_i)true 的行上进行评估,cond_i 仅在 ((NOT cond_1) AND (NOT cond_2) AND ... AND (NOT cond_{i-1}))true 的行上进行评估。例如,使用短路评估时,执行查询 SELECT multiIf(number = 2, intDiv(1, number), number = 5) FROM numbers(10) 时不会抛出除以零的异常。

参数

该函数接受 2N+1 个参数:

  • cond_N — 第 N 个被评估的条件,用于控制是否返回 then_N
  • then_N — 当 cond_N 为 true 时,函数的结果。
  • else — 如果没有条件为 true,函数的结果。

返回值

根据条件 cond_N 返回的 then_Nelse 表达式的结果。

示例

假设该数据表:

直接使用条件结果

条件始终返回 01NULL。因此,您可以像这样直接使用条件结果:

条件中的 NULL 值

当条件中涉及 NULL 值时,结果也将为 NULL

因此,如果类型是 Nullable,则应仔细构建查询。

以下示例通过未能将等于条件添加到 multiIf 中演示了这一点。

greatest

返回一系列值中的最大值。所有列表成员必须是可比较的类型。

示例:

备注

返回的类型是 Float64,因为 UInt8 必须被提升到 64 位进行比较。

备注

返回的类型是 DateTime64,因为 DateTime32 必须被提升到 64 位进行比较。

least

返回一系列值中的最小值。所有列表成员必须是可比较的类型。

示例:

备注

返回的类型是 Float64,因为 UInt8 必须被提升到 64 位进行比较。

备注

返回的类型是 DateTime64,因为 DateTime32 必须被提升到 64 位进行比较。

clamp

将返回值限制在 A 和 B 之间。

语法

参数

  • value – 输入值。
  • min – 限制下限。
  • max – 限制上限。

返回值

如果值小于最小值,则返回最小值;如果大于最大值,则返回最大值;否则返回当前值。

示例: