SQL 問題的欄位篩選器
學習如何在 SQL 查詢中使用 Metabase 欄位篩選器來建立更智慧的篩選器小工具。
本文說明如何使用稱為欄位篩選器的特殊變數類型,將智慧型 SQL 篩選器小工具新增至 Metabase 中的 SQL 查詢。
欄位篩選器簡介
對於以 SQL 撰寫的 Metabase 問題,我們可以使用基本變數類型—文字、數字和日期—來建立簡單的 SQL 篩選器小工具。若要建立「更智慧」的篩選器小工具,可以顯示篩選欄中資料專屬的選項 (例如建立值下拉式選單),我們可以使用稱為欄位篩選器的特殊變數類型。
欄位篩選器起初可能會讓某些人感到困惑,因為它們僅適用於特定欄位,且人們預期它們的行為會像基本輸入變數 (但它們並非如此)。不過,欄位篩選器非常值得學習,因為您可以使用它們來建立更精密的篩選器小工具。本文將深入探討欄位篩選器,但首先讓我們討論欄位篩選器變數與基本文字、數字和日期變數之間的主要差異。
區分欄位篩選器與簡單的文字、數字和日期變數
- 欄位篩選器預設為選用。 若未提供值,SQL 查詢會執行,就像欄位篩選器不存在一樣。不過,您可以選擇要求提供值。
- 欄位篩選器不適用於表格別名。 由於欄位篩選器仰賴關於表格中欄的中繼資料 (以及這些表格的特定名稱),因此篩選器無法「得知」您已為表格建立別名。且根據您使用的資料庫而定,您可能需要在
FROM
子句中包含完整結構描述路徑。 - 欄位篩選器使用特殊語法,因此它們可以處理幕後的 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}}
變數僅接受單一值。
相較之下,欄位篩選器會將變數對應至實際的欄資料。然後,連接至變數的篩選器小工具會「得知」哪些類別可用,並可以呈現這些類別的下拉式選單,如下所示
關於小工具的說明:下拉式選單只是可用的選項之一。在類型為 Category
的欄位 (例如 Products
表格中的 category
欄位) 的情況下,我們也可以將篩選器小工具設定為搜尋方塊或純輸入方塊。管理員可以在管理面板的資料模型索引標籤中設定欄位設定。
請注意,如果欄中不同值的數量大於 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
。
我們不會要求變數,因此不需要預設值。如果查詢在篩選器小工具中沒有指定值的情況下執行,查詢將會傳回所有類別的記錄。
請注意,WHERE
子句未指定變數應等於哪個欄。此隱含語法 (隱藏的 SQL 程式碼) 允許欄位篩選器在幕後處理 SQL 程式碼,以容納多個選取項目。
為日期欄位建立精密的 SQL 篩選器小工具
我們可以建立日期類型的基本輸入變數,這會新增具有簡單日期篩選器的 SQL 篩選器小工具。或者,如果我們使用欄位篩選器變數,我們可以將該變數連接至包含日期的欄位 (欄),這會解鎖更多設定篩選器小工具的選項。以下是 SQL
SELECT *
FROM ORDERS
WHERE {{created_at}}
以下是欄位篩選器對應至日期欄位的不同小工具類型
- 月份和年份
- 季度和年份
- 單一日
- 日期範圍
- 相對日期
- 日期篩選器
每個小工具類型都提供不同的方式讓使用者篩選結果。以下是三個 SQL 欄位篩選器範例
日期篩選器小工具類型提供最大的彈性,讓使用者可以依相對日期和範圍篩選。
欄位篩選器注意事項
當使用者嘗試實作欄位篩選器時,通常會在幾個地方卡住。
欄位篩選器與別名不相容
如上所述,如果您在 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 程式碼以用於多個選取項目等情況,例如,當使用者從下拉式選單中選取多個類別時。
只有特定欄位與欄位篩選器相容
這是相容欄位的清單。
你可以在我們的Field Filters 文件中找到不相容的欄位類型列表。
深入了解 SQL 篩選器和變數
查看我們的基本 SQL 輸入變數指南 - 文字、數字和日期。
您還可以閱讀我們的文件,了解
下一步:SQL 片段:重複使用和分享 SQL 程式碼
了解您需要知道的關於在 SQL 程式碼中使用片段的所有資訊。