You need to enable JavaScript to run this app.
导航
条件函数
最近更新时间:2024.11.11 17:54:03首次发布时间:2022.12.19 15:10:59
复制全文
我的收藏
有用
有用
无用
无用

if

控制条件分支。 与大多数系统不同,ClickHouse始终评估两个表达式 thenelse
语法
SELECT if(cond, then, else)
如果条件 cond 的计算结果为非零值,则返回表达式 then 的结果,并且跳过表达式 else 的结果(如果存在)。 如果 cond 为零或 NULL,则将跳过 then 表达式的结果,并返回 else 表达式的结果(如果存在)。
参数

  • cond – 条件结果可以为零或不为零。 类型是 UInt8,Nullable(UInt8) 或 NULL。
  • then - 如果满足条件则返回的表达式。
  • else - 如果不满足条件则返回的表达式。

返回值
该函数执行 thenelse 表达式并返回其结果,这取决于条件 cond 最终是否为零。
示例
查询:
SELECT if(1, plus(2, 2), plus(2, 6))
结果:

┌─plus(2, 2)─┐
│          4 │
└────────────┘

查询:
SELECT if(0, plus(2, 2), plus(2, 6))
结果:

┌─plus(2, 6)─┐
│          8 │
└────────────┘
  • thenelse 必须具有最低的通用类型。

示例:
给定表LEFT_RIGHT:
SELECT *FROM LEFT_RIGHT ┌─left─┬─right─┐ │ ᴺᵁᴸᴸ │ 4 │ │ 1 │ 3 │ │ 2 │ 2 │ │ 3 │ 1 │ │ 4 │ ᴺᵁᴸᴸ │ └──────┴───────┘
下面的查询比较了 leftright 的值:
SELECT left, right, if(left < right, 'left is smaller than right', 'right is greater or equal than left') AS is_smaller FROM LEFT_RIGHT WHERE isNotNull(left) AND isNotNull(right) ┌─left─┬─right─┬─is_smaller──────────────────────────┐ │ 1 │ 3 │ left is smaller than right │ │ 2 │ 2 │ right is greater or equal than left │ │ 3 │ 1 │ right is greater or equal than left │ └──────┴───────┴─────────────────────────────────────┘
注意:在此示例中未使用'NULL'值,请检查条件中的NULL值 部分。

三元运算符

if 函数相同。
语法: cond ? then : else
如果cond != 0则返回then,如果cond = 0则返回else

  • cond必须是UInt8类型,thenelse必须存在最低的共同类型。
  • thenelse可以是NULL

multiIf

允许您在查询中更紧凑地编写CASE运算符。

multiIf(cond_1, then_1, cond_2, then_2...else)

参数:

  • cond_N — 函数返回then_N的条件。
  • then_N — 执行时函数的结果。
  • else — 如果没有满足任何条件,则为函数的结果。

该函数接受2N + 1参数。
返回值
该函数返回值«then_N»或«else»之一,具体取决于条件cond_N
示例
再次使用表 LEFT_RIGHT
SELECT left, right, multiIf(left < right, 'left is smaller', left > right, 'left is greater', left = right, 'Both equal', 'Null value') AS result FROM LEFT_RIGHT ┌─left─┬─right─┬─result──────────┐ │ ᴺᵁᴸᴸ │ 4 │ Null value │ │ 1 │ 3 │ left is smaller │ │ 2 │ 2 │ Both equal │ │ 3 │ 1 │ left is greater │ │ 4 │ ᴺᵁᴸᴸ │ Null value │ └──────┴───────┴─────────────────┘

直接使用条件结果 {#using-conditional-results-directly}

条件结果始终为 01NULL。 因此,你可以像这样直接使用条件结果:
SELECT left < right AS is_small FROM LEFT_RIGHT ┌─is_small─┐ │ ᴺᵁᴸᴸ │ │ 1 │ │ 0 │ │ 0 │ │ ᴺᵁᴸᴸ │ └──────────┘

条件中的NULL值

当条件中包含 NULL 值时,结果也将为 NULL
SELECTNULL < 1, 2 < NULL, NULL < NULL, NULL = NULL ┌─less(NULL, 1)─┬─less(2, NULL)─┬─less(NULL, NULL)─┬─equals(NULL, NULL)─┐ │ ᴺᵁᴸᴸ │ ᴺᵁᴸᴸ │ ᴺᵁᴸᴸ │ ᴺᵁᴸᴸ │ └───────────────┴───────────────┴──────────────────┴────────────────────┘
因此,如果类型是 Nullable,你应该仔细构造查询。
以下示例说明这一点。
SELECT left, right, multiIf(left < right, 'left is smaller', left > right, 'right is smaller', 'Both equal') AS faulty_result FROM LEFT_RIGHT ┌─left─┬─right─┬─faulty_result────┐ │ ᴺᵁᴸᴸ │ 4 │ Both equal │ │ 1 │ 3 │ left is smaller │ │ 2 │ 2 │ Both equal │ │ 3 │ 1 │ right is smaller │ │ 4 │ ᴺᵁᴸᴸ │ Both equal │ └──────┴───────┴──────────────────┘