概览
直接使用条件结果
0、1 或 NULL。因此,你可以像下面这样直接使用条件结果:
条件表达式中的 NULL 值
NULL 值时,结果也会是 NULL。
Nullable,你应该谨慎构造查询。
下面的示例说明了这一点:由于没有给 multiIf 添加相等条件,因此会失败。
CASE 语句
CASE WHEN ... THEN ... ELSE ... END
这种形式具有完全的灵活性,内部通过 multiIf 函数实现。每个条件都会独立求值,表达式中也可以包含非常量值。
CASE <expr> WHEN <val1> THEN ... WHEN <val2> THEN ... ELSE ... END
这种更紧凑的形式针对常量值匹配做了优化,内部使用caseWithExpression()。
注意事项
multiIf) 的结果类型。当返回表达式的类型不一致时,例如使用了不同的时区或数值类型,这一点尤为重要。
- 结果类型会根据所有分支中最大的兼容类型来确定。
- 一旦确定了该类型,所有其他分支都会被隐式转换为该类型——即使这些分支的逻辑在运行时根本不会执行。
- 对于 DateTime64 这类类型,由于时区是类型签名的一部分,这可能导致一些出乎意料的行为:首次遇到的时区可能会被用于所有分支,即使其他分支指定了不同的时区。
Asia/Kolkata
DateTime64(3, <timezone>) 返回类型。它会将首先遇到的类型推断为通用类型,即 DateTime64(3, 'Asia/Kolkata',并将其他分支隐式转换为该类型。
这可以通过转换为字符串来解决,以保留预期的时区格式:
clamp
value— 待限制的值。 -min— 最小边界。 -max— 最大边界。
Query
Response
Query
Response
Query
Response
greatest
NULL 参数会被忽略。
- 对于数组,返回按字典序排序后最大的数组。
- 对于
DateTime类型,结果类型会提升为范围最大的类型 (例如,与DateTime32混用时,结果为DateTime64) 。
使用 setting
least_greatest_legacy_null_behavior 更改 NULL 的行为版本 24.12 引入了一项向后不兼容的变更:NULL 值会被忽略;而在此前,只要参数中有一个是 NULL,就会返回 NULL。
如需保留之前的行为,请将 setting least_greatest_legacy_null_behavior (默认值:false) 设置为 true。x1[, x2, ...]— 一个或多个待比较的值。所有参数都必须是可比较的类型。Any
Any
示例
数值类型
Query
Response
Query
Response
Query
Response
if
- 如果条件
cond的求值结果为非零值,则函数返回表达式then的结果。 - 如果
cond的求值结果为零或 NULL,则返回else表达式的结果。
short_circuit_function_evaluation 用于控制是否启用短路求值。
启用后,仅在 cond 为 true 的行上计算 then 表达式,而仅在 cond 为 false 的行上计算 else 表达式。
例如,启用短路求值后,执行以下查询时不会因除以零而抛出异常:
then 和 else 必须为相近类型。
语法
cond— 要计算的条件。UInt8或Nullable(UInt8)或NULLthen— 如果cond为true,则返回该表达式。-else— 如果cond为false或NULL,则返回该表达式。
cond,返回 then 或 else 表达式的结果。
示例
用法示例
Query
Response
least
NULL 参数会被忽略。
- 对于数组,返回按字典序最小的数组。
- 对于 DateTime 类型,结果类型会提升为最大的类型 (例如,与 DateTime32 混用时结果为 DateTime64) 。
使用设置
least_greatest_legacy_null_behavior 更改 NULL 行为版本 24.12 引入了一项向后不兼容的更改:现在会忽略 NULL 值;而此前只要有一个参数为 NULL,就会返回 NULL。
若要保留之前的行为,请将设置 least_greatest_legacy_null_behavior (默认值:false) 设为 true。x1[, x2, ...]— 要比较的单个值或多个值。所有参数都必须属于可比较的类型。Any
Any
示例
数值类型
Query
Response
Query
Response
Query
Response
multiIf
CASE 运算符。
按顺序计算各个条件。对于第一个为 true (非零且不为 NULL) 的条件,返回对应的分支值。
如果没有任何条件为 true,则返回 else 值。
设置 short_circuit_function_evaluation 用于控制
是否使用短路求值。如果启用,then_i 表达式仅会在
((NOT cond_1) AND ... AND (NOT cond_{i-1}) AND cond_i) 为 true 的行上计算。
例如,使用短路求值时,执行以下查询不会抛出除以零异常:
NULL 条件会被视为 false。
语法
caseWithoutExpression, caseWithoutExpr
参数
cond_N— 第 N 个求值条件,用于控制是否返回then_N。UInt8或Nullable(UInt8)或NULLthen_N— 当cond_N为 true 时,函数返回的结果。 -else— 如果所有条件都不为 true,函数返回的结果。
cond_N 对应的 then_N 结果;否则返回 else 的结果。
示例
使用示例
Query
Response