使用 SQL 變數建立篩選器
如何在原生 SQL 查詢中使用基本輸入變數(文字、數字和日期)建立篩選器小工具。
本文逐步說明如何使用原生 SQL 查詢在 Metabase 中建立問題,以便問題的檢視者可以插入值並篩選結果。雖然 Metabase 可以輕鬆地在不使用 SQL 的情況下摘要和視覺化資料,但資料分析師有時需要深入研究複雜的查詢,他們可以使用 Metabase 的SQL 編輯器撰寫這些查詢。
SQL 變數和篩選器小工具簡介
例如,使用 Metabase 隨附的範例資料庫,我們可能會在 SQL 中撰寫一個問題,以提取有關我們訂單的產品資訊,但我們希望該問題的檢視者指定他們想要檢視的產品類別。為了讓使用者能夠在已儲存的 SQL 問題上輸入值,我們可以撰寫具有變數的 SQL 查詢,而 Metabase 將自動建立篩選器小工具,供使用者輸入值。
目前,我們只會專注於套用至以 SQL 撰寫的問題的篩選器。如需儀表板上的篩選器,請參閱將篩選器新增至具有 SQL 問題的儀表板。
但首先:您想要使用 SQL 撰寫您的問題,還是查詢產生器更適合您的使用案例?
SQL 問題 vs. 查詢產生器問題
在我們深入探討新增篩選器小工具之前,值得考慮使用者將如何使用我們的問題。如果我們只想讓使用者能夠在儀表板上的簡單篩選器小工具中插入值,則在查詢產生器中撰寫問題並將變數新增至我們的 SQL 程式碼是有意義的。
相反地,如果我們使用查詢產生器撰寫問題,則篩選器小工具是不必要的,因為我們問題的檢視者將擁有完整的查詢建立基本元素套件,可以透過聯結、篩選和摘要資料,以他們喜歡的任何方式切分和篩選資料。對於更複雜的問題,他們也將擁有自訂表達式可供使用,以及能夠鑽取資料以放大訂單,或點擊值以檢視個別記錄的功能 - 此功能不適用於以 SQL 撰寫的問題。
如果您可以使用查詢產生器中的功能回答您的問題,我們建議您使用這些功能。但是,如果您需要自訂 SQL 命令或函數,並且您希望使用者能夠篩選這些問題的結果,請繼續閱讀。
適用於原生 SQL 查詢的不同變數類型
對於使用 Metabase 的原生 SQL 查詢編輯器撰寫的問題,您可以選取四種變數類型
- 文字
- 數字
- 日期
- 欄位篩選器
這些類型中的其中一種,欄位篩選器,與其他類型不同。事實上,最好將變數類型分為兩個主要類別:基本輸入變數和欄位篩選器。
-
基本輸入變數會建立簡單的篩選器小工具,使用者可以在其中插入值以篩選問題的結果。基本輸入變數包含
-
欄位篩選器變數是特殊的輸入變數。它們比基本輸入變數更複雜,而且行為不同。欄位篩選器「連接」到欄位,並且可以提供下拉式選單,供使用者選取一個或多個值。
我們將在下面介紹三個基本輸入變數 — 文字、數字和日期 — 以及另一篇文章中的欄位篩選器。但首先,讓我們瞭解何時選擇一種變數類型而不是另一種。
欄位篩選器或基本輸入變數?
何時使用基本輸入變數
- 適用於簡單的文字、數字和日期篩選。如需更彈性的日期篩選,請使用欄位篩選器。
- 一般而言,適用於不計其數的值,這些值不適合包含在下拉式選單中(這將需要欄位篩選器)。
- 適用於您可能需要在 SQL 中對輸入變數執行一些資料整理/修改的情況。
何時使用欄位篩選器
- 提供下拉式選單,供使用者從定義的值中選取。請參閱清單的可用欄位類型。
- 提供多種依日期篩選的方式。
- 將變數連接到儀表板上的篩選器小工具。
基本輸入變數
基本輸入變數接受文字、數字或日期等輸入。當值未預先定義或範圍廣泛時,基本輸入變數非常有用,例如訂單小計。日期是一種特殊情況:Metabase 提供小工具,讓使用者可以選取日期和時間,而不是輸入值。
基本輸入變數:數字
讓我們使用數字類型的基本輸入變數。假設我們想要建立一個問題,該問題傳回 Orders
表格中的所有記錄,但我們想要讓使用者可以根據訂單 subtotal
篩選掉訂單。
讓我們保持簡單,只讓使用者可以輸入數字,以便問題將傳回小計大於該數字的訂單記錄。
若要在查詢中包含變數,只需將變數名稱括在雙大括號中,例如:{{ variable }}
。在此範例中,我們將變數命名為 {{subtotal_var}}
。以下是 SQL
SELECT *
FROM orders
WHERE subtotal > {{subtotal_var}}
當我們將變數新增至 SQL 查詢時,Metabase 會在問題頂端新增篩選器小工具,並滑出側邊欄以顯示變數的選項。
以下是變數側邊欄中的選項
- 變數類型:類型可以是
Text
、Number
、Date
或Field filter
。變數類型決定變數小工具的輸入介面(例如,針對Date
,小工具將顯示日期選擇器)。 - 篩選器小工具標籤:在小工具中呈現的變數名稱,預設為 SQL 查詢中的變數名稱。
- 必要?當您將變數設為必要時,Metabase 會提示您提供預設篩選器小工具值,以便在首次載入問題時插入變數。如果您未提供預設值,則 Metabase 在提供值之前不會執行查詢。
在 subtotal_var
的情況下,我們想要
- 將
Variable type
設定為Number
(因為我們處理的是小計)。 - 將
Filter widget label
從subtotal_var
變更為Subtotal
(只是為了使其更易於閱讀)。 - 將
Required?
切換為 true。 - 將
Default filter widget value
設定為0
。這樣一來,當問題執行時,它將自動傳回所有結果;使用者可以輸入較高的小計(如果他們希望篩選結果)。
現在我們已準備好將值插入我們的小計小工具,並篩選小計大於該值的訂單
使基本輸入變數成為選用項目
如果我們想要使篩選器小工具成為選用項目,我們可以將 WHERE
子句括在雙括號中
SELECT *
FROM orders
[[WHERE subtotal > {{subtotal_var}}]]
如果檢視者未輸入小計,且未設定預設值,則在括號中的 WHERE
子句中,查詢只會傳回 Orders
表格中的所有記錄(亦即,Metabase 只會執行 SELECT * FROM orders
)。
新增多個篩選器
我們也可以使用多個篩選器。例如,如果我們希望使用者透過輸入一系列小計值來篩選結果,我們可以為下限和上限新增兩個變數
SELECT *
FROM orders
WHERE subtotal BETWEEN {{subtotal_min}} AND {{subtotal_max}}
在這種情況下,將會出現兩個小工具,每個變數各一個。
基本輸入變數:文字
讓我們試試看使用簡單文字輸入變數的範例。在此情況下,我們想要建立一個具有篩選器小工具的問題,讓使用者可以搜尋包含他們輸入到小工具中的文字的產品標題。
以下是程式碼
SELECT *
FROM products
[[WHERE UPPER(title) LIKE UPPER(CONCAT('%', {{search_term}},'%'))]]
我們將 WHERE
子句括在括號中,以使小工具輸入成為選用項目。我們使用萬用字元 %
包夾變數,以表示該詞彙在變數的左側或右側可能具有零個或多個字元。此外,我們透過在 title
欄位和 {{search_term}}
上使用 UPPER
函數來防止區分大小寫。
以下是我們的篩選器
基本輸入變數:日期
當您選取日期變數類型時,篩選器小工具將顯示簡單的日期選擇器。以下是有兩個基本日期變數的問題,以便使用者可以輸入開始和結束日期,以傳回在這些日期之間下的訂單。
SELECT *
FROM orders
[[WHERE created_at BETWEEN {{start_date}} AND {{end_date}}]]
請注意,使用者需要選取兩個小工具的日期,篩選器才能啟用,這可能會導致非預期的行為。例如,有人可能會將結束日期留白,並預期訂單將從開始日期篩選到今天,但實際上不會套用任何篩選器。
對於日期,請考慮改用欄位篩選器,它提供了更大的彈性。
下一步:SQL 問題的欄位篩選器
瞭解如何在 SQL 查詢中使用 Metabase 欄位篩選器來建立更智慧的篩選器小工具。