【发布时间】:2020-12-27 06:46:39
【问题描述】:
我在使用 python 列表注入执行此 SQL 语句时遇到问题。我是 teradata SQL 的新手,我不确定这是否是将列表注入 where 子句的合适语法。
conn = teradatasql.connect(host='PROD', user='1234', password='1234', logmech='LDAP')
l = ["Comp-EN Routing", "Comp-COLLABORATION"]
l2 = ["PEO", "TEP"]
l3 = ["TCV"]
crsr = conn.cursor()
query = """SELECT SOURCE_ORDER_NUMBER
FROM DL_.BV_DETAIL
WHERE (LEVEL_1 IN ? AND LEVEL_2 IN ?) or LEVEL_3 IN ?"""
crsr.executemany(query, [l,l2,l3])
conn.autocommit = True
我不断收到此错误
Version 17.0.0.2] [Session 308831600] [Teradata Database] [Error 3939] There is a mismatch between the number of parameters specified and the number of parameters required.
【问题讨论】:
-
每个
?参数标记只能替换为单个值,而不是值列表。 SQLIN的语法需要在值列表周围加上括号。特别是如果每个列表中的项目数可能不同,您可能需要考虑将值列表格式化为查询文本,而不是将值作为参数传递。否则,您可能必须为每个列表动态生成具有正确数量的?的语句.. -
请注意,
executemany将尝试为列表列表中的每个值列表执行一次query。如果查询中有三个?,则每个参数列表都应包含 3 个值。