【问题标题】:Python CX_Oracle : oracle query with conditions including a list of values(IN)Python CX_Oracle : oracle 查询条件包括值列表(IN)
【发布时间】:2018-04-13 03:06:00
【问题描述】:

我想使用 cx_oracle 从 python 中的数据库表中获取值列表。我无法编写具有两个 where 条件的查询,一个是单个值,另一个是列表。

当我分别过滤两个字符串或仅通过字符串列表过滤它时,我能够实现它。但是不能一起实现!!

    output_list=[]
    catlist = ','.join(":x%d" % i for i, _ in enumerate(category_list))        
    db_cursor = connection.cursor()
    db_cursor.execute("""
    SELECT LWEX_WORD_EXCLUDE
    FROM WCG_SRC_WORD_EXCLUDE
    WHERE LWEX_CATEGORY IN (%s) and LWIN_USER_UPDATED = :did""" % catlist, category_list, did =argUser)
    for word in db_cursor :
        output_list.append(word[0])

当前代码抛出错误。但是,如果我分别有任何一个条件,那么它就可以正常工作。我使用的python版本是3.5

【问题讨论】:

    标签: python python-3.x cx-oracle


    【解决方案1】:

    您不能混合和匹配“按位置绑定”和“按名称绑定”,这就是您在上面的代码中所做的。我的建议是改为这样做:

    output_list=[]
    catlist = ','.join(":x%d" % i for i, _ in enumerate(category_list))
    bindvals = category_list + [arguser]       
    db_cursor = connection.cursor()
    db_cursor.execute("""
    SELECT LWEX_WORD_EXCLUDE
    FROM WCG_SRC_WORD_EXCLUDE
    WHERE LWEX_CATEGORY IN (%s) and LWIN_USER_UPDATED = :did""" % catlist, bindvals)
    for word in db_cursor :
        output_list.append(word[0])
    

    【讨论】:

    • 如果您像这样构建 SQL 字符串并多次执行变体,请注意对优化器、数据库游标重用和语句缓存的非最佳影响。如果您在 IN 子句中有少量固定的值,您可能希望使用固定的绑定名称列表,并在查询的特定执行不需要某些绑定变量的值的情况下绑定 NULL。一般概念见oracle.github.io/node-oracledb/doc/api.html#sqlwherein
    猜你喜欢
    • 2021-07-22
    • 2016-02-02
    • 2021-07-02
    • 1970-01-01
    • 2021-11-11
    • 2020-07-09
    • 2019-01-01
    • 2011-03-28
    相关资源
    最近更新 更多