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

如何实现可基于不同列过滤数据的交替SQL查询函数?

实现动态列过滤的SQL查询函数

没问题,我来帮你搞定这个能基于不同列动态过滤数据的load_sql函数。核心思路是根据传入的参数动态构建WHERE子句,只保留有有效值的过滤条件,同时严格使用参数化查询避免SQL注入风险。

完整实现代码

import sqlite3

el = [["a", "b", 1], ["a", "b", 3]]

def save_sql(foo):
    with sqlite3.connect("fn.db") as db:
        cur = db.cursor()
        cur.execute("CREATE TABLE IF NOT EXISTS et (var1 VARCHAR, var2 VARCHAR, var3 INT)")
        cur.executemany("INSERT INTO et VALUES (?,?,?)", foo)
        db.commit()

def load_sql(v1=None, v2=None, v3=None):
    with sqlite3.connect("fn.db") as db:
        cur = db.cursor()
        # 初始化条件和参数容器
        filter_conditions = []
        query_params = []
        
        # 逐个检查参数,添加对应过滤条件
        if v1 is not None:
            filter_conditions.append("var1 = ?")
            query_params.append(v1)
        if v2 is not None:
            filter_conditions.append("var2 = ?")
            query_params.append(v2)
        if v3 is not None:
            filter_conditions.append("var3 = ?")
            query_params.append(v3)
        
        # 拼接最终SQL语句
        base_sql = "SELECT * FROM et"
        if filter_conditions:
            # 用AND连接多个条件
            base_sql += " WHERE " + " AND ".join(filter_conditions)
        
        # 执行查询并返回结果
        cur.execute(base_sql, query_params)
        return cur.fetchall()

# 测试用例
save_sql(el)
# 仅按var1过滤
print(load_sql(v1="a"))  # 输出:[('a', 'b', 1), ('a', 'b', 3)]
# 仅按var3过滤
print(load_sql(v3=3))    # 输出:[('a', 'b', 3)]
# 多条件组合过滤
print(load_sql(v1="a", v2="b"))  # 输出:[('a', 'b', 1), ('a', 'b', 3)]
# 查询所有数据
print(load_sql())        # 输出表中所有记录

关键细节说明

  • 动态条件构建:通过判断参数是否为None(你可以根据业务需求调整判断逻辑,比如允许空字符串的话改成if v1 is not None and v1 != ""),只把有有效输入的列加入过滤条件。
  • 参数化查询:始终使用?作为占位符,将参数值单独传入execute方法,这是避免SQL注入的最佳实践,绝对不要直接把参数拼接到SQL字符串里。
  • 灵活组合:多个过滤条件之间用AND连接,符合常规的多条件查询逻辑,如果你需要OR逻辑,只需要把" AND ".join改成" OR ".join即可。

扩展优化方向

如果需要支持更复杂的查询(比如模糊匹配、范围查询),可以修改条件的构建方式,例如:

# 模糊查询var1
if v1 is not None:
    filter_conditions.append("var1 LIKE ?")
    query_params.append(f"%{v1}%")

# 查询var3大于某个值
if v3 is not None:
    filter_conditions.append("var3 > ?")
    query_params.append(v3)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.22 07:46:00