Metabase执行SQL查询报and附近语法错误如何排查解决
错误诱因
这个语法错误是Metabase原生可选SQL片段的拼接逻辑、以及SQL写法疏漏共同导致的:
- Metabase中用
[[ ]]双中括号包裹的内容是可选拼接片段:只有片段内的变量被赋值、非空时,整段内容才会被拼接到最终执行的SQL中;如果对应变量未传值,中括号包裹的整段内容会被完全删除。 - 当前写法把带
WHERE关键字的时间筛选段单独包在了中括号里,一旦{{from}}/{{to}}参数未传值,整段带WHERE的内容会被删掉,最终执行的SQL会变成FROM order_order and {{partner_id}},FROM子句后直接接AND必然触发语法错误。 - 写法中
and {{partner_id}}本身也存在语法问题:Metabase变量只会替换参数值,不会自动补全字段名和比较逻辑,直接把变量接在AND后本身就不符合SQL语法。
正确写法
推荐用通用兼容写法,不管哪个筛选参数为空都不会触发语法错误:
SELECT user_id FROM order_order WHERE 1=1 [[AND date_placed BETWEEN {{from}} AND {{to}}]] [[AND partner_id = {{partner_id}}]]
这个写法的逻辑是:
- 固定写
WHERE 1=1作为永远成立的占位条件,不会因为可选片段丢失出现WHERE关键字缺失的问题 - 每个筛选条件单独包裹在可选片段中,前面带
AND,Metabase会自动识别处理第一个有效条件前多余的AND,不会出现语法问题 - 每个筛选条件明确写清字段名和比较逻辑,参数变量只负责传值
如果业务要求两个筛选参数必须同时传值才能生效,也可以把两个条件放到同一个可选片段里:
SELECT user_id FROM order_order [[ WHERE date_placed BETWEEN {{from}} AND {{to}} AND partner_id = {{partner_id}} ]]
内容的提问来源于stack exchange,提问作者khanmazhar
相关产品推荐
相关产品推荐

