偵錯 SQL 語法錯誤

當您的查詢傳回錯誤訊息時該怎麼辦。

閱讀錯誤訊息不應該感覺像在解謎。本偵錯指南說明您可以如何處理拒絕執行的頑固查詢。

偵錯 SQL 查詢

如果您的 SQL 查詢包含看起來像 {{ variable }} 的 SQL 變數,請先前往SQL 變數疑難排解

  1. 前往 SQL 查詢中失敗的行。
  2. 檢查 SQL 查詢中失敗行的 SQL 語法
  3. 如果查詢使用聯結、子查詢或 CTE,請檢查您的查詢邏輯
  4. 如果您收到與 SQL 查詢無關的錯誤訊息,請前往錯誤訊息疑難排解

SQL 偵錯如何運作?

  • SQL 錯誤訊息會針對查詢中每一行無法執行的行顯示。您需要針對每一行失敗的行,遵循上述步驟。
  • 如果您對某一行進行任何變更,請執行查詢以檢查問題是否已修正,再繼續進行下一步。您可以在查詢結尾新增 LIMIT 子句,以加快程序。
  • 請注意,SQL 查詢並非由上而下執行,因此您不會按照查詢行的編寫順序進行偵錯。請依照錯誤訊息來協助您尋找需要注意的行。

偵錯 SQL 語法

  1. 檢查 SQL 查詢中失敗行的拼字。
  2. 檢查 SQL 查詢中失敗行是否有遺漏括號或逗號。
  3. 移除註解行(以 --/* 開頭的行)。
  4. 檢查特定於您的 SQL 方言的常見語法錯誤。

說明

您的資料庫需要能夠「讀取」您的查詢,才能執行查詢。

  • 正確的拼字會明確告知您的資料庫尋找的內容。
  • 標點符號會告知您的資料庫如何(例如,要使用的順序)尋找您的資料。
  • 註解並非旨在讀取或執行,但有時尾隨的空格或符號可能會意外干擾相鄰行的讀取和執行。

常見 SQL 參考指南

在開始之前,請開啟您使用的 SQL 方言的 SQL 參考指南。我們在此連結了一些最常見的指南

常見 SQL 語法錯誤

您的錯誤訊息說了什麼?

欄或表格名稱「找不到」或「無法辨識」

如果您的 SQL 查詢包含看起來像 {{ variable }} 的 SQL 變數,請先前往SQL 變數疑難排解

步驟

  1. 檢查您的 SQL 方言的參考指南結構章節。

    • 您是否使用正確的引號?例如

      • SELECT 'column_name'
      • SELECT "column_name"
      • SELECT `column_name`
    • 您是否使用正確的欄和表格路徑?例如

      • FROM table_name
      • FROM schema_name.table_name
      • FROM database_name.schema_name.table_name
    • 您的欄名稱是否為保留字?例如

      在 PostgresSQL 中,「users」是保留關鍵字.

      • SELECT users 將會擲回錯誤。
      • SELECT "users" 將會正確執行。
    • 提示:使用 Metabase 檢查欄和表格名稱語法

      1. 使用與 SQL 問題相同的欄和表格,在查詢產生器中建立問題。
      2. 將問題轉換為 SQL.
      3. 查看 Metabase 產生的 SQL 查詢如何參照欄和表格名稱。
  2. 檢查查詢中欄和表格名稱的資料參考

    • 如果資料參考中不存在欄或表格名稱

      • 執行 SELECT * FROM your_table_name LIMIT 10; 以尋找要在查詢中使用的欄或表格名稱。
      • 如果您是 Metabase 管理員,請檢查資料模型頁面以取得原始結構描述
    • 如果欄名稱存在,但是您無法從 SQL 編輯器查詢欄

      • 詢問您的 Metabase 管理員,是否已在資料庫端重新命名或移除欄。
      • 如果您是 Metabase 管理員,您可能需要執行同步以重新整理您的資料。

說明

您需要確保您使用的是資料庫使用的 SQL 方言的正確語法。

您的查詢也需要使用與資料庫中原始名稱相符的欄和表格名稱。Metabase 使用可由 Metabase 管理員更新的顯示名稱,因此資料參考可能與您的資料庫結構描述不符。也可能是欄或表格已在資料庫端重新命名,但是 Metabase 尚未執行同步來擷取更新。

延伸閱讀

SQL 函數不存在

如果您的 SQL 查詢包含看起來像 {{ variable }} 的 SQL 變數,請先前往SQL 變數疑難排解

步驟

  1. 檢查您要函數套用的欄的資料類型。

    • 您可以使用 Metabase 資料參考來檢查欄的欄位類型(作為資料類型的代理)。
    • 如果您有權限存取資訊結構描述,您也可以直接在資料庫中查詢資訊結構描述。
  2. 檢查您的 SQL 方言的參考指南函數章節。

    • 確認函數存在於您的 SQL 方言中。
    • 檢查您的函數接受的資料類型。
  3. 如果您的欄的欄位類型與函數的預期資料類型不符

說明

SQL 函數旨在處理資料庫中的特定資料類型。例如,PostgresSQL 中的 DATE_TRUNC 函數適用於 Postgres 資料庫中具有 datetimestamptime 類型資料的欄。如果您嘗試在資料庫中資料類型為 string 的欄上使用 DATE_TRUNC 函數,則會無法運作。

請注意,Metabase 欄位類型與資料庫中的資料類型並非一對一。在這種情況下,欄位類型會提供您足夠的欄資料類型資訊,以疑難排解錯誤。

延伸閱讀

如何在 SQL 查詢中尋找失敗的行

如果您的 SQL 查詢包含看起來像 {{ variable }} 的 SQL 變數,請先前往SQL 變數疑難排解

一旦您找到 SQL 查詢中失敗的行,請前往偵錯 SQL 查詢下的步驟。

閱讀您的 SQL 錯誤訊息

您的錯誤訊息是否

  • 告訴您行或字元位置?
  • 包含表格或欄名稱?如果表格或欄名稱在您的查詢中出現多次,請縮減您的查詢大小
  • 提及 SQL 子句?

縮減 SQL 查詢的大小

如果您的查詢使用

  • 子查詢(巢狀查詢),請分別執行每個子查詢。從內部子查詢開始,然後逐步向外進行。
  • CTE,請分別執行每個 CTE。從您的基礎 CTE 開始,然後逐步向下查詢。
  • 指向 Metabase 模型的 SQL 變數,請分別執行每個模型。開啟變數面板以前往模型,或從變數在 Metabase 搜尋列中輸入模型 ID 編號。
  • 請記得在嘗試隔離問題時,閱讀 SQL 錯誤訊息。如需更多資訊,請前往SQL 偵錯如何運作?

在 SQL 編輯器中工作的提示

醒目提示 SQL 查詢的行以

  • 使用 Cmd + ReturnCtrl + Enter 執行行。
  • 使用 Cmd + /Ctrl + / 註解/取消註解行。

如何找出要使用哪種 SQL 方言

SQL 方言是以儲存您要查詢的表格的資料庫為基礎。一旦您找出要使用哪種 SQL 方言,您可以遵循偵錯 SQL 查詢下的步驟。

若要找出您正在查詢哪個資料庫

  • 如果您是 Metabase 管理員,請前往管理設定 > 資料庫,並查看引擎欄下方。
  • 否則,請詢問設定您的 Metabase 的人員。

您有不同的問題嗎?

您仍然卡住了嗎?

搜尋或詢問 Metabase 社群

下一步:偵錯 SQL 查詢邏輯

當您的查詢傳回看起來不正確的資料時該怎麼辦。

下一篇文章