You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

如何用IF函数选择SQLite查询?及SQL语法错误排查

问题解答

关于CEIL(Sock*?)的写法正确性

首先可以明确:CEIL(Sock*?)的写法是完全正确的

你自定义了SQLite的CEIL函数接收单个数值参数,Sock*?的逻辑是将表中Sock列的数值与占位符对应的qty值相乘,得到的结果作为参数传入CEIL函数,语法上完全符合SQLite的运算规则。

针对你遇到的syntax error排查方向

虽然CEIL的写法没问题,但可以从这几个点检查错误来源:

  • 确认Costing表中所有引用的列(UpperStiffenerInsole等12个列)都存在,且列名没有拼写错误,也没有使用SQLite关键字(如果列名是关键字,需要用双引号括起来,比如"Upper")。
  • Quantity的值做类型转换:你用StringVar获取的是字符串,建议转换为数值类型后再传入SQL,避免潜在的类型问题:
    try:
        qty = float(Quantity.get())
    except ValueError:
        result0.config(text="请输入有效的数字数量")
        return
    
  • 打印完整SQL语句验证语法:可以在cursor.execute前添加打印语句,确认拼接后的SQL没有语法错误:
    sql = '''SELECT CEIL(Upper*?),
    CEIL(Stiffener*?),
    CEIL(Insole*?),CEIL(Sock*?),
    CEIL(Laces*?),
    CEIL(Foil*?),
    CEIL(PBA887*?),
    CEIL(Soles*?),
    CEIL(Eyelets*?),
    CEIL(IA80*?),
    CEIL(GussetElastic*?),
    CEIL(Cartons*?) 
    FROM Costing WHERE Type=?'''
    print(sql)
    

另外,你的代码中conn.commit()是多余的——SELECT查询不需要提交事务,只有INSERT/UPDATE/DELETE这类修改数据的操作才需要提交。


如何用条件逻辑区分不同的SQL查询语句

分两种场景来实现,根据你的实际需求选择:

场景1:在SQL语句内部用条件逻辑(SQLite原生IF/CASE WHEN)

如果需要根据表中字段的值动态调整计算逻辑,可以用SQLite的IF函数(语法:IF(条件, 满足时结果, 不满足时结果))或者更灵活的CASE WHEN

比如根据Type的值调整Upper的计算系数:

SELECT 
    IF(Type='A', CEIL(Upper*?), CEIL(Upper*?*1.1)), -- Type为A时用基础值,否则乘1.1
    CEIL(Stiffener*?),
    -- 其他列的计算...
FROM Costing WHERE Type=?

复杂多条件场景用CASE WHEN

SELECT 
    CASE 
        WHEN Type='A' THEN CEIL(Upper*?)
        WHEN Type='B' THEN CEIL(Upper*?*0.9)
        ELSE CEIL(Upper*?*1.0)
    END AS Upper_Calc,
    CEIL(Stiffener*?),
    -- 其他列的计算...
FROM Costing WHERE Type=?

注意:这种写法需要对应增加占位符的数量(比如上面的IF例子需要两个?对应Upper的不同计算逻辑)。

场景2:在Python代码中根据条件切换完整SQL语句

如果需要根据Python中的变量(比如filter的值)选择完全不同的查询结构,可以在代码里用条件判断拼接SQL:

def calc(filter):
    # 先处理数量输入验证
    try:
        qty = float(Quantity.get())
    except ValueError:
        result0.config(text="请输入有效的数字数量")
        return

    with sqlite3.connect('Test.sql3') as conn:
        cursor = conn.cursor()
        conn.create_function("CEIL", 1, lambda v: int(math.ceil(v)) if v is not None else None)

        # 根据filter值选择不同的SQL和参数
        if filter == "TypeA":
            sql = '''SELECT CEIL(Upper*?), CEIL(Stiffener*?) FROM Costing WHERE Type=?'''
            params = (qty, qty, filter)
        elif filter == "TypeB":
            sql = '''SELECT CEIL(Sock*?), CEIL(Laces*?) FROM Costing WHERE Type=? AND Status='Active' '''
            params = (qty, qty, filter)
        else:
            # 默认的完整查询
            sql = '''SELECT CEIL(Upper*?),
CEIL(Stiffener*?),
CEIL(Insole*?),CEIL(Sock*?),
CEIL(Laces*?),
CEIL(Foil*?),
CEIL(PBA887*?),
CEIL(Soles*?),
CEIL(Eyelets*?),
CEIL(IA80*?),
CEIL(GussetElastic*?),
CEIL(Cartons*?) 
FROM Costing WHERE Type=?'''
            params = (qty, qty, qty, qty, qty, qty, qty, qty, qty, qty, qty, qty, filter)

        cursor.execute(sql, params)
        results = cursor.fetchall()
        item_0_in_result0 = [_[0] for _ in results]
        result0.config(text=item_0_in_result0)

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

火山引擎 最新活动