【问题标题】:Conditionally add WHERE clause in Python for cx_Oracle在 Python 中为 cx_Oracle 有条件地添加 WHERE 子句
【发布时间】:2020-06-05 15:10:43
【问题描述】:

我有以下 Python 代码:

    params = {}
    query = 'SELECT * FROM LOGS '
    if(date_from and date_to):
        query += ' WHERE LOG_DATE BETWEEN TO_DATE(:date_start, "MM-DD-YYYY") AND LOG_DATE <= TO_DATE(:date_end, "MM-DD-YYYY")'
        params['date_start'] = date_from
        params['date_end'] = date_to
    if(structure):
        query += ' AND STRUCTURE=:structure_val'
        params['structure_val'] = structure
    if(status):
        query += ' AND STATUS =:status'
        params['status'] = status

    cursor.execute(query, params)

这里我有条件地将WHERE 子句添加到查询中。但是当我对日期没有价值时会出现问题,因为它不会采用WHERE,并且会在没有WHERE 的情况下添加AND。如果我在查询中添加 where 子句,如果没有过滤器,那么它将给出错误的查询。有没有更好的方法来做到这一点?我一直在使用Laravel,它的查询生成器有一个方法when,这将有助于添加条件where 子句。 cx_Oracle 在 Python 中有类似的东西吗?

【问题讨论】:

    标签: python flask cx-oracle


    【解决方案1】:
    params = {}
    query = 'SELECT * FROM LOGS '
    query_conditions = []
    
    if(date_from and date_to):
        query_conditions.apend(' WHERE LOG_DATE BETWEEN TO_DATE(:date_start, "MM-DD-YYYY") AND LOG_DATE <= TO_DATE(:date_end, "MM-DD-YYYY")')
        params['date_start'] = date_from
        params['date_end'] = date_to
    if(structure):
        query_conditions.append('STRUCTURE=:structure_val')
        params['structure_val'] = structure
    if(status):
         query_conditions.append('STATUS =:status')
        params['status'] = status
    if query_conditions:
        query += " AND ".join(query_conditions)
    
    cursor.execute(query, params)
    

    将它们添加到 list 并使用 AND 连接值

    【讨论】:

    • 如果第一个条件没有值,第二个条件有值,则WHERE不会被添加。
    • 是的,我只是想给你一个逻辑,我认为其余的事情你可以处理:)
    猜你喜欢
    • 1970-01-01
    • 2016-12-16
    • 2021-05-16
    • 2013-12-23
    • 1970-01-01
    • 2019-11-12
    • 1970-01-01
    • 1970-01-01
    • 2017-03-25
    相关资源
    最近更新 更多