代码之家  ›  专栏  ›  技术社区  ›  ruohola

当值有时为空时参数化SQL查询

  •  0
  • ruohola  · 技术社区  · 7 年前

    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 = get_value()  # can return a string or None
    
    query = \
        """
        SELECT *
        FROM TestTable
        WHERE Column ???????????
        """
    
    cursor.execute(query, value)
    
    1 回复  |  直到 7 年前
        1
  •  4
  •   Gordon Linoff    7 年前

    解决方案是使用ISO/ANSI标准 NULL -安全比较:

    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)