【问题标题】:How to parameterize SQL query when the parameter can sometimes be NULL?当参数有时可以为 NULL 时如何参数化 SQL 查询?
【发布时间】:2018-09-24 14:12:49
【问题描述】:

使用pyodbc,我可以像这样对查询进行参数化;

value = "testval"

query = \
    """
    SELECT *
    FROM TestTable
    WHERE Column = ?;
    """

cursor.execute(query, value)

但问题是如果value 是None,查询应该是这样的;

value = None

query = \
    """
    SELECT *
    FROM TestTable
    WHERE Column IS NULL;
    """

cursor.execute(query)

那么当value 可以是 None 或字符串时,查询应该是什么样子;

value = get_value()  # can return a string or None

query = \
    """
    SELECT *
    FROM TestTable
    WHERE Column ???????????
    """

cursor.execute(query, value)

【问题讨论】:

    标签: python sql sql-server tsql pyodbc


    【解决方案1】:

    解决办法是使用ISO/ANSI标准NULL-safe比较:

    WHERE Column IS NOT DISTINCT FROM ?
    

    并不是所有的数据库都支持这个,所以你也可以使用:

    WHERE Column = ? OR (Column IS NULL AND ? IS NULL)
    

    如果你不愿意两次传递参数,你可以将它包含在FROM子句中:

    . . .
    FROM . . . CROSS JOIN
         (SELECT ? as compColumn) params
    WHERE (Column = params.compColumn0 or (Column IS NULL and params.compColumn IS NULL)
    

    【讨论】:

    • 我是否纠正了第一个不适用于 sql-server?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-06-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多