案例

case 检查一个值是否与一组条件匹配,并根据第一个满足的条件返回某些输出。基本上,case 的功能与 “if…then” 逻辑 相同,但编写起来更简洁。

你可以选择性地告诉 case 在没有任何条件满足时返回默认输出。如果你没有设置默认输出,case 在检查所有条件后将返回 null(在 Metabase 中,null 值显示为空白值)。

当你需要时使用 case 表达式

语法
case(condition1, output1, condition2, output2, ..., default_output)
返回满足的第一个条件的输出。
示例
case(isempty("glass half full"), "empty glass", isnull("glass half full"), "missing glass", "glass half full")
“glass half full”

为频率表或直方图分类数据

金额 分类
6 0-9
18 10-19
31 30-39
57 50+

其中 分类 是一个包含表达式的自定义列

case([Amount] >= 0  AND [Amount] <=  9,  "0-9",
     [Amount] >= 10 AND [Amount] <= 19,  "10-19",
     [Amount] >= 20 AND [Amount] <= 29,  "20-29",
     [Amount] >= 30 AND [Amount] <= 39,  "30-39",
     [Amount] >= 40 AND [Amount] <= 49,  "40-49", "50+")

基于多列条件对行进行标记

目击 ID 有翅膀 有面部 目击类型
1 True True
2 True False 飞机
3 False False 超人
4 False True 未知

其中 目击类型 是一个包含表达式的自定义列

case([Has Wings] = TRUE  AND [Has Face] = TRUE,  "Bird",
     [Has Wings] = TRUE  AND [Has Face] = FALSE, "Plane",
     [Has Wings] = FALSE AND [Has Face] = TRUE,  "Superman", "Unknown")

你可以使用包含你的“标签”的列来

根据多列条件聚合数据

你可以将 case聚合函数 结合使用,以仅聚合满足你的条件的行。

例如,如果我们想按订单日期对每个订单的唯一数量进行计数,但只限于“已发货”状态

订单 ID 订单日期 状态
1 2022-04-01 已支付
1 2022-04-03 已发货
2 2022-05-12 已支付
2 2022-05-12 已取消
  1. 创建自定义表达式 distinct(case([Status] = "Shipped", [Order ID])) 并将其命名为“总已发货订单”。
  2. 选择 订单日期 作为分组列。
  3. 点击 可视化 返回结果
订单日期 总已发货订单
2022-04-01 1
2022-05-01 0

接受的数据类型

数据类型 case 一起使用
字符串
数字
时间戳
布尔值
JSON

限制

所有输出必须具有相同的数据类型。

避免:

case(condition1, "string", condition2, TRUE, condition3, 1)

:

case(condition1, "string", condition2, "TRUE", condition3, "1")

本节介绍了可以与 Metabase case 表达式互换使用的函数和公式,并附有有关如何根据你的用例选择最佳选项的说明。

Metabase 表达式

其他工具

Coalesce

使用 Coalesce: 合并值 示例中的表格

注释 注释 将([Notes],[Comments] "没有笔记或评论。")合并
我有笔记。 我有评论。 我有笔记。
  我有评论。 我有评论。
我有笔记。   我有笔记。
    没有笔记或评论。

关于Metabase coalesce表达式

coalesce([Notes], [Comments] "No notes or comments.")

case表达式等价

case(ISBLANK([Notes]) = FALSE AND ISBLANK([Comments]) = FALSE, [Notes],
     ISBLANK([Notes]) = TRUE  AND ISBLANK([Comments]) = False, [Comments],
     ISBLANK([Notes]) = FALSE AND ISBLANK([Comments]) = TRUE,  [Notes],
     ISBLANK([Notes]) = TRUE  AND ISBLANK([Comments]) = TRUE,  "No notes or comments")

coalesce在两个列均不为空时取第一个值时更容易书写。如果你不介意这样,可以使用case来定义特定输出(例如,“我有笔记评论”)。

Countif

使用基于多列条件聚合数据示例中的表格

订单 ID 订单日期 状态
1 2022-04-01 已支付
1 2022-04-03 已发货
2 2022-05-12 已支付
2 2022-05-12 已取消

关于Metabase countif表达式

countif(case([Status] = "Shipped"))

case表达式等价

count(case([Status] = "Shipped", [Row ID]))

countif在计算满足条件的所有行时与case等价。如果你想要计算满足条件的唯一行,则不等价。

Sumif

使用基于多列条件聚合数据示例的扩展版本表格

行ID 订单 ID 订单日期 状态 金额
1 1 2022-04-01 已支付 $20
2 1 2022-04-03 已发货 $20
3 2 2022-05-12 已支付 $80
4 2 2022-05-12 已取消 $80

关于Metabase sumif表达式

sumif([Amount], [Status] = "Shipped")

case表达式等价

sum(case([Status] = "Shipped", [Amount]))

sumif在仅有一个条件时对单个列求和时与case等价。

如果你想在第二个、独立的条件下对第二个列求和,应该使用case。例如,如果你想在状态 = “已发货”时求和金额列,以及在状态 = “已退款”时求和(假设的)退款金额列。

SQL

在大多数情况下(除非你使用NoSQL数据库),使用笔记本编辑器创建的问题将被转换为针对你的数据库或数据仓库运行的SQL查询。Metabase的case表达式将被转换为SQL的CASE WHEN语句。

使用基于多列条件标记行示例中的表格

目击 ID 有翅膀 有面部 目击类型
1 True True
2 True False 飞机
3 False False 超人
4 False True 未知

SQL的CASE WHEN语句

SELECT
    CASE WHEN "Has Wings" = TRUE  AND "Has Face" = TRUE  THEN "Bird"
         WHEN "Has Wings" = TRUE  AND "Has Face" = FALSE THEN "Plane"
         WHEN "Has Wings" = FALSE AND "Has Face" = TRUE  THEN "Superman"
         ELSE "Unknown" END
FROM mystery_sightings

与用于观测类型case表达式等价

case([Has Wings] = TRUE  AND [Has Face] = TRUE,  "Bird",
     [Has Wings] = TRUE  AND [Has Face] = FALSE, "Plane",
     [Has Wings] = FALSE AND [Has Face] = TRUE,  "Superman", "Unknown")

例如,这个SQL技巧用于排序条形图可以使用Metabase的case表达式来编写。

电子表格

使用基于多列条件标记行示例中的表格

目击 ID 有翅膀 有面部 目击类型
1 True True
2 True False 飞机
3 False False 超人
4 False True 未知

电子表格公式

=IF(AND(B2 = TRUE, C2 = TRUE), "Bird",
    IF(AND(B2 = TRUE, C2 = FALSE), "Plane",
       IF(AND(B2 = FALSE, C2 = TRUE), "Superman", "Unknown")
      )
    )

与用于观测类型case表达式等价

case([Has Wings] = TRUE  AND [Has Face] = TRUE,  "Bird",
     [Has Wings] = TRUE  AND [Has Face] = FALSE, "Plane",
     [Has Wings] = FALSE AND [Has Face] = TRUE,  "Superman", "Unknown")

Python

有几种方法可以使用Python实现条件逻辑。我们将介绍那些可以转换为Metabase case表达式的做法。

使用基于多列条件标记行示例中的表格(假设它在一个名为df的数据框中)

目击 ID 有翅膀 有面部 目击类型
1 True True
2 True False 飞机
3 False False 超人
4 False True 未知

numpy select()

conditions = [
    (df["has_wings"] == True) & (df["has_face"] == True),
    (df["has_wings"] == True) & (df["has_face"] == False),
    (df["has_wings"] == False) & (df["has_face"] == True)]

outputs = ["Bird", "Plane", "Superman"]

df["Sighting Type"] = np.select(conditions, outputs, default="Unknown")

使用pandas apply()的辅助函数

def Identify(df):
    if ((df["has_wings"] == True) & (df["has_face"] == True)):
        return "Bird"
    elif ((df["has_wings"] == True) & (df["has_face"] == False)):
        return "Plane"
    elif ((df["has_wings"] == False) & (df["has_face"] == True)):
        return "Superman"
    else:
        return "Unknown"

df["Sighting Type"]= df.apply(Identify, axis=1)

上述方法与用于观测类型case表达式等价

case([Has Wings] = TRUE  AND [Has Face] = TRUE,  "Bird",
     [Has Wings] = TRUE  AND [Has Face] = FALSE, "Plane",
     [Has Wings] = FALSE AND [Has Face] = TRUE,  "Superman", "Unknown")

进一步阅读

阅读关于其他Metabase版本的文档。

想改进这些文档? 提出更改。