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

如何将字典转换为SQL查询?动态生成SQL遇问题求助

动态生成SQL查询的实现方案

需求说明

给定如下结构的payload:

payload={
    'Tables':['A', 'B'],
    'Cols':{"A":["Product_Name","Product_Desc","Sales"],
            "B":['Product_Size', 'Product_Desc']},
     'Function': {
         'agg': [{'Type': 'sum', 'Value': 'Sales'}],  # 注:原payload中Value为Enrollments,与期望输出的SUM(Sales)不符,此处修正为Sales
        "groupby": ['Product_Name','Product_Desc']
}}

期望生成的SQL查询结果:

Query={
    'A':"SELECT Product_Name, Product_Desc, SUM(Sales) FROM A GROUP BY Product_Name, Product_Desc;",
    'B': "SELECT Product_Size, Product_Desc FROM B"
}

现有代码问题

当前代码仅处理了GROUP BY子句的判断逻辑,既没有构建完整的SELECT语句,也未处理聚合函数的生成,且直接修改了原col_info的结构,逻辑不完整,无法生成符合要求的SQL。

正确实现代码

# 初始化存储查询结果的字典
Query = {}

# 从payload中提取关键信息
tables = payload['Tables']
cols_map = payload['Cols']
function = payload.get('Function', {})
groupby_cols = function.get('groupby', [])
agg_funcs = function.get('agg', [])

# 遍历每个表生成对应SQL
for table in tables:
    table_cols = cols_map[table]
    select_parts = []
    
    # 检查当前表是否包含所有分组列
    has_groupby = all(col in table_cols for col in groupby_cols)
    
    if has_groupby and agg_funcs:
        # 添加分组列到SELECT部分
        select_parts.extend(groupby_cols)
        # 生成聚合函数表达式
        for agg in agg_funcs:
            agg_type = agg['Type'].upper()
            agg_col = agg['Value']
            # 确保聚合列存在于当前表中
            if agg_col in table_cols:
                select_parts.append(f"{agg_type}({agg_col})")
        # 拼接完整SQL
        select_clause = ", ".join(select_parts)
        groupby_clause = ", ".join(groupby_cols)
        sql = f"SELECT {select_clause} FROM {table} GROUP BY {groupby_clause};"
    else:
        # 不满足分组条件时,查询当前表所有列
        select_clause = ", ".join(table_cols)
        sql = f"SELECT {select_clause} FROM {table}"
    
    Query[table] = sql

print(Query)

代码说明

  • 容错性处理:用get方法提取Function配置,避免因key不存在抛出异常
  • 表级独立判断:针对每个表单独校验是否满足分组聚合条件,适配不同表的列结构差异
  • 规范生成聚合函数:将聚合类型转为大写(符合SQL语法规范),并验证聚合列是否存在于当前表中
  • 分支构建SQL:根据是否满足分组条件,分别生成带GROUP BY的聚合查询或普通全列查询

内容的提问来源于stack exchange,提问作者Nason Thomas

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.15 17:27:33