6

我希望能够将某些内容传递给 SQL 查询,以确定我是否只想选择某个列为空的那些。如果我只是构建一个查询字符串而不是使用绑定变量,我会这样做:

if ($search_undeleted_only)
{
    $sqlString .= " AND deleted_on IS NULL";
}

但我想使用绑定查询。这会是最好的方法吗?

my $stmt = $dbh->prepare(...
    "AND (? = 0 OR deleted_on IS NULL) ");
$stmt->execute($search_undeleted_only);
4

3 回答 3

4

是的; 一个相关的技巧是,如果你有 X 个潜在的过滤器,其中一些是可选的,就是让模板说" AND ( ?=-1 OR some_field = ? ) ",并创建一个特殊的函数来包装执行调用并绑定所有第二个 ?s。(在这种情况下,-1 是一个特殊值,意思是“忽略此过滤器”)。

Paul Tomblin 的更新:我编辑了答案以包含评论中的建议。

于 2009-01-11T21:00:10.747 回答
2

所以你依赖布尔表达式的短路语义来调用你的IS NULL条件?这似乎行得通。

一个有趣的点是,1 = 0查询优化器应该排除像这样没有参数的常量表达式。在这种情况下,由于优化器不知道表达式是常量true还是false直到执行时间,这意味着它无法将其分解。它必须评估每一行的表达式。

因此,相对于使用非参数化常量表达式的成本,可以假设这会为查询增加少量成本。

Then combining with OR with the IS NULL expression may also have implications for the optimizer. It might decide it can't benefit from an index on deleted_on, whereas in a simpler expression it would have. This depends on the RDBMS implementation you're using, and the distribution of values in your database.

于 2009-01-11T21:07:26.720 回答
1

我认为这是一种合理的做法。它很好地遵循了正常的过滤器模式,并且应该提供良好的性能。

于 2009-01-11T21:00:31.663 回答