【问题标题】:inputing python list into Teradata SQL将 python 列表输入 Teradata SQL
【发布时间】: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.

【问题讨论】:

  • 每个? 参数标记只能替换为单个值,而不是值列表。 SQL IN 的语法需要在值列表周围加上括号。特别是如果每​​个列表中的项目数可能不同,您可能需要考虑将值列表格式化为查询文本,而不是将值作为参数传递。否则,您可能必须为每个列表动态生成具有正确数量的 ? 的语句..
  • 请注意,executemany 将尝试为列表列表中的每个值列表执行一次query。如果查询中有三个?,则每个参数列表都应包含 3 个值。

标签: python sql teradata


【解决方案1】:

这个问题迟到了,但如果我发现了这个问题,其他人将来也会。

teradatasql 中的executemany 要求第二个参数是"sequence of sequences"。我们通常在 Python 中使用的最常见的sequence 类型是list。本质上,您需要一个列表,其中包含列表中的每个元素的列表。

在您的情况下,这可能如下所示:

myListOfLists=[['level1valueA','level1valueA','level3valueA'],['level1valueB','level1valueB','level3valueB']]

您的 SQL 语句将执行两次,列表中的每个列表执行一次。

在你的情况下,虽然我怀疑你想要找到你存储在三个列表中的值的任何组合,这是完全不同的蜡球,并且需要一些创造力(生成一个包含所有可能的列表的列表组合并提交到executemany 或者构造一个 SQL 语句,该语句可以接收多个以逗号分隔的值列表,形成笛卡尔积并测试命中)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-04-06
    • 1970-01-01
    • 2017-07-19
    • 2014-06-24
    • 1970-01-01
    • 1970-01-01
    • 2018-03-11
    • 1970-01-01
    相关资源
    最近更新 更多