调试 SQL 语法错误
当您的查询返回错误消息时该做什么。
阅读错误消息不应该感觉像解决谜题。本调试指南解释了您可以对拒绝运行的顽固查询采取哪些措施。
调试SQL查询
如果您的SQL查询包含看起来像 {{ variable }}
的SQL变量,请先访问 SQL变量故障排除。
- 转到您的SQL查询中失败的行。
- 检查您的SQL查询中失败的行上的 SQL语法。
- 如果查询使用了连接、子查询或CTE,请检查您的 查询逻辑。
- 如果您收到一个不是针对您的SQL查询的错误消息,请访问 错误消息故障排除。
SQL调试是如何工作的?
- SQL错误消息会显示在您查询中每行失败运行的地方。您需要为每行失败的行执行上述步骤。
- 如果您对某一行进行了更改,在继续到下一步之前,运行您的查询以检查问题是否已解决。您可以在查询末尾添加一个
LIMIT
子句以加快过程。 - 请注意,SQL查询不是从上到下运行的,因此您不会按照它们书写的顺序调试查询行。按照错误消息帮助您找到需要关注的行。
调试SQL语法
- 检查您的SQL查询中失败的行上的拼写。
- 检查您的SQL查询中失败的行上缺失的括号或逗号。
- 删除注释行(以
--
或/*
开头的行)。 - 检查针对您的SQL方言特有的常见语法错误。
说明
您的数据库需要能够“阅读”您的查询才能执行它。
- 正确的拼写会告诉您的数据库确切地要查找什么。
- 标点符号会告诉您的数据库如何(例如,使用什么顺序)查找您的数据。
- 注释不是用来阅读或执行的,但有时尾随空格或符号可能会意外地干扰相邻行的读取和执行。
常见的SQL参考指南
在开始之前,打开您所使用的SQL方言的SQL参考指南。我们在此链接了一些最常用的。
常见的 SQL 语法错误
您的错误信息是什么?
列名或表名“未找到”或“未识别”
如果您的SQL查询包含看起来像 {{ variable }}
的SQL变量,请先访问 SQL变量故障排除。
步骤
-
请查阅您的 SQL 语言的参考指南中的“结构”部分。
-
您是否使用了正确的引号?例如
SELECT '列名'
SELECT "列名"
SELECT `列名`
-
您是否使用了正确的列和表的路径?例如
FROM 表名
FROM 模式名.表名
FROM 数据库名.模式名.表名
-
您的列名是否为保留字?例如
在 PostgreSQL 中,“users”是一个保留关键字.
SELECT users
将会抛出错误。SELECT "users"
将会正常运行。
-
提示:使用 Metabase 检查列和表名语法
- 在查询构建器中创建一个与您的 SQL 问题相同的列和表的问题。
- 将问题转换为 SQL.
- 查看 Metabase 生成的 SQL 查询如何引用列和表名。
-
-
查阅您查询中列和表名的数据参考。
说明
您需要确保您使用的是数据库使用的 SQL 语言的正确语法。
您的查询还需要使用与您数据库中原始名称匹配的列和表名。Metabase 使用可以由您的 Metabase 管理员更新的显示名称,因此数据参考可能不会与您的数据库架构匹配。还有可能列或表在数据库端已被重命名,但 Metabase 未运行同步以获取更新。
进一步阅读
SQL 函数不存在
如果您的SQL查询包含看起来像 {{ variable }}
的SQL变量,请先访问 SQL变量故障排除。
步骤
-
请查阅您想应用函数的列的数据类型。
- 您可以使用 Metabase 的数据参考来查看列的字段类型(作为数据类型的代理)。
- 如果您有权访问它,您也可以直接查询数据库中的信息模式。
-
请查阅您的 SQL 语言的参考指南中的“函数”部分。
- 确认该函数对您的 SQL 语言的适用性。
- 请查阅您的函数接受的数据类型。
-
如果您的列的字段类型与函数预期的数据类型不匹配
- 在您的 SQL 查询中将您的列转换为正确的数据类型。
- 如果您是 Metabase 管理员,您也可以从数据模型页面转换数据类型。
说明
SQL函数被设计用于处理数据库中特定的数据类型。例如,PostgreSQL中的DATE_TRUNC
函数(详情请见PostgreSQL DATE_TRUNC 函数文档)可以作用于PostgreSQL数据库中数据类型为date
、timestamp
和time
的列。如果你尝试在一个数据类型为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 + Return
或Ctrl + Enter
来运行这些行。 - 使用
Cmd + /
或Ctrl + /
来注释/取消注释这些行。
如何找出要使用的SQL方言
SQL方言基于存储你想要查询的表的数据库。一旦你知道了要使用哪个SQL方言,你就可以按照调试SQL查询部分的步骤进行。
要找出你正在查询的数据库
- 如果你是Metabase管理员,请转到管理员设置 > 数据库,然后查看引擎列。
- 否则,请询问设置Metabase的人。
你有不同的问题吗?
你仍然困扰吗?
搜索或向Metabase社区提问。
下一节:调试SQL查询逻辑
当你查询返回看起来不正确的数据时应该做什么。