You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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 ')'"。

  • 解决方法:

    1. 兼容空筛选场景:修改SQL语句,添加空值判断逻辑,避免生成空的IN子句:
      SELECT * FROM dbo.AllPayments 
      WHERE ({{ filter_values('MSO')|where_in }} OR {{ filter_values('MSO')|length }} = 0)
      
      当没有筛选值时,OR后的条件生效,返回所有数据;有筛选值时则正常过滤。
    2. 设置参数默认值:在数据集的参数配置中,给MSO参数设置至少一个默认值,确保不会出现空列表的情况。比如将val设为["DEN"],这样即使用户未操作筛选器,也会生成合法的IN ('DEN')语法。
    3. 模板条件分支处理:用模板语法判断筛选值是否为空,动态生成合法的SQL:
      SELECT * FROM dbo.AllPayments 
      {% if filter_values('MSO') %}
        WHERE MSO IN {{ filter_values('MSO')|where_in }}
      {% endif %}
      
      这种方式下,没有筛选值时直接去掉WHERE条件,返回全量数据;有筛选值时正常添加过滤逻辑。

内容的提问来源于stack exchange,提问作者Hardik Martand Trivedi

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.18 14:47:40