Apache Superset使用Jinja参数创建图表时出现SQL语法错误
问题描述
我通过SQL Lab创建了一个带参数的数据集,在SQL Lab中运行查询时一切正常,但使用该数据集创建图表时出现以下错误:
Error: (102, b"Incorrect syntax near ')'.DB-Lib error message 20018, severity 15:
General SQL Server error: Check messages from the SQL Server
")
我的SQL Lab查询语句:
SELECT * FROM dbo.AllPayments WHERE MSO IN {{ filter_values('MSO')|where_in }}
参数配置:
{ "_filters": [ { "col": "MSO", "op": "IN", "val": ["DEN", "Hathway"] } ] }
原本预期将该图表添加到带有MSO字段筛选条件的仪表板时,系统能将用户选择的筛选值传递给参数并过滤结果,但实际出现报错,请问问题出在哪里?
问题原因与解决方法
问题根源:SQL Server不允许
IN ()这种空括号的语法。SQL Lab中运行正常是因为配置的参数有具体值,模板会生成IN ('DEN', 'Hathway')这种合法语法;但在图表或仪表板场景下,若用户未选择任何筛选值,或者参数传递了空列表,where_in过滤器会生成(),触发SQL语法错误,也就是你看到的"Incorrect syntax near ')'"。解决方法:
- 兼容空筛选场景:修改SQL语句,添加空值判断逻辑,避免生成空的IN子句:
当没有筛选值时,SELECT * FROM dbo.AllPayments WHERE ({{ filter_values('MSO')|where_in }} OR {{ filter_values('MSO')|length }} = 0)OR后的条件生效,返回所有数据;有筛选值时则正常过滤。 - 设置参数默认值:在数据集的参数配置中,给MSO参数设置至少一个默认值,确保不会出现空列表的情况。比如将
val设为["DEN"],这样即使用户未操作筛选器,也会生成合法的IN ('DEN')语法。 - 模板条件分支处理:用模板语法判断筛选值是否为空,动态生成合法的SQL:
这种方式下,没有筛选值时直接去掉WHERE条件,返回全量数据;有筛选值时正常添加过滤逻辑。SELECT * FROM dbo.AllPayments {% if filter_values('MSO') %} WHERE MSO IN {{ filter_values('MSO')|where_in }} {% endif %}
- 兼容空筛选场景:修改SQL语句,添加空值判断逻辑,避免生成空的IN子句:
内容的提问来源于stack exchange,提问作者Hardik Martand Trivedi
相关产品推荐
相关产品推荐

