调试 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 '列名'
      • SELECT "列名"
      • SELECT `列名`
    • 您是否使用了正确的列和表的路径?例如

      • FROM 表名
      • FROM 模式名.表名
      • FROM 数据库名.模式名.表名
    • 您的列名是否为保留字?例如

      在 PostgreSQL 中,“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 查询中将您的列转换为正确的数据类型。
    • 如果您是 Metabase 管理员,您也可以从数据模型页面转换数据类型。

说明

SQL函数被设计用于处理数据库中特定的数据类型。例如,PostgreSQL中的DATE_TRUNC函数(详情请见PostgreSQL DATE_TRUNC 函数文档)可以作用于PostgreSQL数据库中数据类型为datetimestamptime的列。如果你尝试在一个数据类型为string的列上使用DATE_TRUNC函数,它将无法工作。

请注意,Metabase的字段类型与数据库中的数据类型并非一一对应。在这种情况下,字段类型可以提供足够的信息来帮助你排查错误。

进一步阅读

如何在SQL查询中找到失败的行

如果您的SQL查询包含看起来像 {{ variable }} 的SQL变量,请先访问 SQL变量故障排除

一旦你找到了SQL查询中失败的行,请转到调试SQL查询部分。

阅读SQL错误信息

你的错误信息

  • 是否指出了行或字符位置?
  • 是否包含了表或列名?如果表或列名在查询中出现多次,请减小查询的大小
  • 是否提到了SQL子句?

减小SQL查询的大小

如果你的查询使用了

  • 子查询(嵌套查询),请分别运行每个子查询。从内层子查询开始,逐步向外。
  • 公用表表达式(CTE),请分别运行每个CTE。从基本CTE开始,逐步向下运行查询。
  • 指向Metabase模型的SQL变量,请分别运行每个模型。可以通过打开变量面板或输入变量中的模型ID号到Metabase搜索栏来访问模型。
  • 记住,在尝试隔离问题时,要阅读SQL错误信息。有关更多信息,请参阅SQL调试如何工作

在SQL编辑器中工作的技巧

要高亮显示SQL查询的行,以

  • 使用Cmd + ReturnCtrl + Enter来运行这些行。
  • 使用Cmd + /Ctrl + /来注释/取消注释这些行。

如何找出要使用的SQL方言

SQL方言基于存储你想要查询的表的数据库。一旦你知道了要使用哪个SQL方言,你就可以按照调试SQL查询部分的步骤进行。

要找出你正在查询的数据库

  • 如果你是Metabase管理员,请转到管理员设置 > 数据库,然后查看引擎列。
  • 否则,请询问设置Metabase的人。

你有不同的问题吗?

你仍然困扰吗?

搜索或向Metabase社区提问。

下一节:调试SQL查询逻辑

当你查询返回看起来不正确的数据时应该做什么。

下一篇文章