【问题标题】:Python psycopg2 dynamic where clause with optional AND based on conditionalPython psycopg2 动态 where 子句,带有基于条件的可选 AND
【发布时间】:2018-12-23 08:50:46
【问题描述】:

这可能不是一个新问题,但在谷歌搜索和挖掘 SO 一段时间后,我一直无法找到合适的解决方案。我想根据是否设置变量将条件 AND 添加到我的 WHERE 子句中。

我可以在字符串格式中加入一个三元组,但这似乎不是一个好的解决方案。

def run_query(start_date, end_date, value):
    query = """
    SELECT * FROM table WHERE value = %(value)s {date_clause}""".format(date_clause = "AND start_date >= %(start_date)s AND end_date <= %(end_date)s" if start_date is not None and end_date is not Null else "")

cursor.execute(query, {"start_date": None, "end_date": None, "value": value})

【问题讨论】:

    标签: python postgresql psycopg2


    【解决方案1】:

    可以使用Postgres函数COALESCE()

    query = """
    SELECT * 
    FROM my_table 
    WHERE column = %(value)s 
    AND otherColumn = COALESCE(%(otherValue)s, '')
    
    """
    

    otherValue 为None 时将转换为Postgres NULL 并且COALESCE() 返回一个空字符串。

    【讨论】:

    • 感谢忘记了 COALESCE,但如果我的条件检查是日期,我认为这不会起作用,但不确定空字符串是否会起作用。编辑我的帖子以显示我最终做了什么。我也在研究 pyscopg2 sql.SQL 组合 initd.org/psycopg/docs/sql.html#module-psycopg2.sql
    猜你喜欢
    • 2019-10-18
    • 2021-10-28
    • 2010-12-15
    • 2021-07-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多