SQL 問題的欄位篩選器

學習如何在 SQL 查詢中使用 Metabase 欄位篩選器來建立更智慧的篩選器小工具。

本文說明如何使用稱為欄位篩選器的特殊變數類型,將智慧型 SQL 篩選器小工具新增至 Metabase 中的 SQL 查詢。

欄位篩選器簡介

A Field Filter is a special type of variable that can wire up a variable in your SQL code to a field (column) in a table, which enables it to create a

對於以 SQL 撰寫的 Metabase 問題,我們可以使用基本變數類型—文字、數字和日期—來建立簡單的 SQL 篩選器小工具。若要建立「更智慧」的篩選器小工具,可以顯示篩選欄中資料專屬的選項 (例如建立值下拉式選單),我們可以使用稱為欄位篩選器的特殊變數類型。

To create a Field Filter, add a variable to your SQL code by enclosing the variable in double braces (Mustache style), and select Field Filter as the Variable type from the Variables sidebar.

欄位篩選器起初可能會讓某些人感到困惑,因為它們僅適用於特定欄位,且人們預期它們的行為會像基本輸入變數 (但它們並非如此)。不過,欄位篩選器非常值得學習,因為您可以使用它們來建立更精密的篩選器小工具。本文將深入探討欄位篩選器,但首先讓我們討論欄位篩選器變數與基本文字、數字和日期變數之間的主要差異。

區分欄位篩選器與簡單的文字、數字和日期變數

  1. 欄位篩選器預設為選用。 若未提供值,SQL 查詢會執行,就像欄位篩選器不存在一樣。不過,您可以選擇要求提供值。
  2. 欄位篩選器不適用於表格別名。 由於欄位篩選器仰賴關於表格中欄的中繼資料 (以及這些表格的特定名稱),因此篩選器無法「得知」您已為表格建立別名。且根據您使用的資料庫而定,您可能需要在 FROM 子句中包含完整結構描述路徑。
  3. 欄位篩選器使用特殊語法,因此它們可以處理幕後的 SQL 程式碼。 您只需將欄位篩選器提供給 WHERE 子句 (不含欄或運算子),欄位篩選器就會為您管理 SQL 程式碼。這允許程式碼考量人們在篩選器小工具中進行的多個選取項目。

重點 3 可能特別令人困惑,因此讓我們用一個範例來解說。

使用下拉式選單建立 SQL 篩選器小工具

我們將使用 Metabase 隨附的範例資料庫,將具有下拉式選單的篩選器小工具新增至以 SQL 撰寫的問題。假設我們想要建立一個 SQL 問題,以擷取 Orders 表格中的所有訂單,但我們想要讓使用者可以選擇依 Products 表格中的類別篩選結果。我們可以使用基本輸入變數建立 Products.category 篩選器,如下所示

SELECT *
FROM Orders
LEFT JOIN Products
ON Orders.product_id = Products.id
[[WHERE Products.category = {{category}}]];

在此案例中,我們將 WHERE 子句括在雙括號中,使輸入成為選用,並使用變數側邊欄將變數類型設定為 Text,並將篩選器小工具標籤設定為 Category。此方法可行,但並非理想

  • 為了篩選資料,使用者必須知道哪些類別存在 (並在輸入時正確拼寫它們)。
  • 此外,它們無法一次選取多個類別,因為 {{category}} 變數僅接受單一值。

相較之下,欄位篩選器會將變數對應至實際的欄資料。然後,連接至變數的篩選器小工具會「得知」哪些類別可用,並可以呈現這些類別的下拉式選單,如下所示

A filter widget created by a Field Filter that

關於小工具的說明:下拉式選單只是可用的選項之一。在類型為 Category 的欄位 (例如 Products 表格中的 category 欄位) 的情況下,我們也可以將篩選器小工具設定為搜尋方塊或純輸入方塊。管理員可以在管理面板資料模型索引標籤中設定欄位設定。

In the Data Model tab of the Admin Panel, Admins can edit the field settings. For fields of type Category, Admins can select three options for field widgets: Search box, A list of all values (dropdown), or Plain input box.

請注意,如果欄中不同值的數量大於 300,即使您選取下拉式選單選項,Metabase 也會自動使用搜尋方塊。深入瞭解我們的文件中關於編輯中繼資料的資訊。

現在,讓我們回到我們的問題。以下是 Products.category 欄位篩選器的語法。請注意在 WHERE 子句中變數之前省略的欄和運算子—我們將在下方詳細討論欄位篩選器語法

SELECT *
FROM orders
LEFT JOIN products
ON orders.product_id = products.id
WHERE {{category}};

WHERE 子句中放置變數後,我們可以使用變數側邊欄將我們的變數連接為欄位篩選器。我們將設定

  • 變數類型欄位篩選器
  • 要對應的欄位產品 → 類別。此設定會告知 Metabase 將 SQL 程式碼中的變數連接至 Products 表格的 category 欄。
  • 欄位小工具類型category
  • 欄位小工具標籤category

Setting a variable

我們不會要求變數,因此不需要預設值。如果查詢在篩選器小工具中沒有指定值的情況下執行,查詢將會傳回所有類別的記錄。

請注意,WHERE 子句未指定變數應等於哪個欄。此隱含語法 (隱藏的 SQL 程式碼) 允許欄位篩選器在幕後處理 SQL 程式碼,以容納多個選取項目。

為日期欄位建立精密的 SQL 篩選器小工具

我們可以建立日期類型的基本輸入變數,這會新增具有簡單日期篩選器的 SQL 篩選器小工具。或者,如果我們使用欄位篩選器變數,我們可以將該變數連接至包含日期的欄位 (欄),這會解鎖更多設定篩選器小工具的選項。以下是 SQL

SELECT *
FROM ORDERS
WHERE {{created_at}}

Setting the Field to map to option to a field containing dates will open up a range of Filter widget types: Month and Year, Quarter and Year, Single Date, Date Range, Relative Date, and Date Filter.

以下是欄位篩選器對應至日期欄位的不同小工具類型

  • 月份和年份
  • 季度和年份
  • 單一日
  • 日期範圍
  • 相對日期
  • 日期篩選器

每個小工具類型都提供不同的方式讓使用者篩選結果。以下是三個 SQL 欄位篩選器範例

The Month and Year widget type.

The Relative Date widget type.

The Date Filter widget type.

日期篩選器小工具類型提供最大的彈性,讓使用者可以依相對日期和範圍篩選。

欄位篩選器注意事項

當使用者嘗試實作欄位篩選器時,通常會在幾個地方卡住。

欄位篩選器與別名不相容

如上所述,如果您在 SQL 查詢中使用別名,欄位篩選器將無法運作。例如,此程式碼 (使用別名) 將無法運作

-- DON'T DO THIS
SELECT *
FROM orders AS o
LEFT JOIN products AS p
ON o.product_id = p.id
WHERE {{category}};

然而,此程式碼 (不使用別名) 可運作

SELECT *
FROM orders
LEFT JOIN products
ON orders.product_id = products.id
WHERE {{category}};

原因是欄位篩選器透過分析關於您資料的中繼資料 (例如,表格的欄名稱) 來運作,而該中繼資料不包含您在 SQL 程式碼中建立的別名。請注意,某些資料庫需要在 FROM 子句中包含結構描述。Oracle 的範例會是 FROM "schema"."table"。在 BigQuery 中,需要反引號:FROM `dataset_name.table`

在 WHERE 子句中省略直接指派

如上所述,欄位篩選器周圍的 SQL 程式碼並非完全符合標準。您可能會想要撰寫

-- DON'T DO THIS
WHERE category = {{ category }}

因為這是標準 SQL 中 WHERE 子句的正確語法。但該語法不適用於欄位篩選器。欄位篩選器的正確語法會省略 = 運算子

WHERE {{ category }}

此簡寫的原因是 Metabase 可以在幕後插入 SQL 程式碼以用於多個選取項目等情況,例如,當使用者從下拉式選單中選取多個類別時。

只有特定欄位與欄位篩選器相容

這是相容欄位的清單

Some fields are incompatible with Field Filters. For incompatible fields, you

你可以在我們的Field Filters 文件中找到不相容的欄位類型列表。

深入了解 SQL 篩選器和變數

查看我們的基本 SQL 輸入變數指南 - 文字、數字和日期

您還可以閱讀我們的文件,了解

下一步:SQL 片段:重複使用和分享 SQL 程式碼

了解您需要知道的關於在 SQL 程式碼中使用片段的所有資訊。

下一篇文章