当前位置: 首页 > 面试题库 >

当参数有时可以为NULL时,如何参数化SQL查询?

东门俊智
2023-03-14
问题内容

通过pyodbc我可以参数化这样的查询;

value = "testval"

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

cursor.execute(query, value)

但是问题在于,如果avalue为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)

问题答案:

解决方案是使用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)


 类似资料:
  • 问题内容: 我想使用以下函数(在PostgreSQL中): 我将其翻译成英文时可能会有一些错别字,但只要传递有效参数,实际功能就可以正常工作。但是,例如,我的用户可能不想按用户名过滤结果。或者,他可以选择在日期之后携带数据,但不指定结束日期。我可以做一些像 等等。但是,如果我没记错的话,我必须编写49个查询,因为我有7个可能会或可能不会被过滤的参数。我可以这样做,但是如果可能的话,我想通过做类似的

  • 问题内容: 我问这个问题有点傻,因为我似乎是世界上唯一一个不了解这个问题的人,但是无论如何,这都是可行的。我将以Python为例。当我使用原始SQL查询(通常使用ORM)时,我会使用参数化,例如使用SQLite的以下示例: 方法A: 我知道这可行,我知道这是通常推荐的方式。SQL注入易受攻击的方式可以执行以下操作: 方法B: 到目前为止,我可以告诉我了解SQL注入,如本Wikipedia文章中所述

  • 我想在Select&Create table语句中向查询提供运行时值。参数化Athena SQL查询的方法有哪些?我尝试了从Presto中使用和语句,但它在Athena控制台中不起作用。我们需要任何像Python这样的外部脚本来调用它吗?

  • 问题内容: 我有一个存储在列表中的关键字列表。 要从表中获取记录,请使用以下查询: 您可能已经注意到,我的查询容易受到sql注入的攻击,因此我想通过SqlCommand()使用参数。我已经尝试了以下方法,但仍然无法正常工作: 我在哪里犯错,或者应该怎么做? 问题答案: 您在这里做错了几件事: 您为所有参数赋予相同的名称。那行不通。参数需要唯一的名称。 您为每个项目创建一个新的SqlCommand。

  • 这是在参数是重载函数时重载解析如何工作中提到的更复杂的问题? 下面的代码编译起来没有任何问题: 模板参数推导似乎不是一项具有挑战性的任务-只有一个函数接受两个参数。但是,取消注释的模板重载(仍然只有一个参数)会无缘无故地破坏编译。gcc 5. x/6. x和clang 3.9的编译都失败了。 它可以用重载解析/模板参数推导规则来解释,还是应该在这些编译器中被限定为缺陷?

  • 问题内容: 我尝试过这个,并从JAVA中得到了奇怪的行为,有人可以帮我解释一下吗? 然后我有测试用例: 现在的问题是,如果我打电话直接与参数,我会回来,但如果调用与,它调用,它告诉我该参数不为空,但空数组。 问题答案: 问题是,如果我直接使用参数null调用testNull(),我会回来,但如果使用null调用callTestNull()调用了testNull(),它将告诉我参数不是null,而是