DuckDB参数化查询IN子句报错:如何解决类型转换异常?
解决DuckDB参数化IN查询的类型转换错误
方法一:使用ANY运算符替代IN
修改查询语句,用ANY配合数组参数,DuckDB能正确识别数组类型并匹配字段:
import duckdb query = "SELECT * FROM person WHERE id = ANY(?)" duckdb.execute(query, [[4,5,6]])
原理:ANY运算符专门用于匹配数组中的任意元素,和你的数组参数类型完全兼容,不会触发类型转换错误。
方法二:动态生成IN的占位符
如果一定要用IN,可以根据数组长度生成对应数量的占位符,把数组元素逐个作为参数传递:
import duckdb ids = [4,5,6] # 根据数组长度生成多个?占位符 placeholders = ", ".join(["?"] * len(ids)) query = f"SELECT * FROM person WHERE id IN({placeholders})" # 直接传递展开后的数组元素 duckdb.execute(query, ids)
原理:IN需要的是多个离散的数值参数,这种方式让参数和占位符一一对应,避免了数组类型的转换问题。
原错误原因
你原来的代码中,IN(?)期望接收多个离散的BIGINT类型值,但传递的是一个INTEGER数组,DuckDB目前不支持自动将数组转换为IN所需的参数列表,因此抛出类型转换异常。
内容的提问来源于stack exchange,提问作者Tapabrata Mukherjee
相关产品推荐
相关产品推荐

