案例

case (別名 if) 檢查值是否符合條件列表,並根據符合的第一個條件傳回一些輸出。ifcase 的運作方式完全相同。

您可以選擇性地告知 case,如果沒有符合任何條件,則傳回預設輸出。如果您未設定預設輸出,case 將在檢查完所有條件後傳回 nullnull 值在 Metabase 中顯示為空白值)。

當您需要執行以下操作時,請使用 case 表達式

語法
case(condition1, output1, condition2, output2, ..., default_output)
從符合的第一個條件傳回輸出。
範例
case(isempty("glass half full"), "空杯", isnull("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
2 飛機
3 超人
4 未知

其中「目擊類型」是具有以下表達式的自訂欄

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:合併值 範例的表格

註解 註解 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
2 飛機
3 超人
4 未知

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
2 飛機
3 超人
4 未知

試算表公式

=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
2 飛機
3 超人
4 未知

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 文件。