如何在Perl的DBI中使用绑定查询选择空行?

时间:2009-01-11 20:33:29

标签: sql perl dbi

我希望能够将某些内容传递给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);

3 个答案:

答案 0 :(得分:4)

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

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

答案 1 :(得分:2)

所以你依靠布尔表达式的短路语义来调用你的IS NULL条件?这似乎有效。

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

因此,可以假设这为查询添加了较小的成本,相对于使用非参数化常量表达式所需的成本。

然后将ORIS NULL表达式结合使用也可能对优化程序产生影响。它可能决定它不能从deleted_on上的索引中受益,而在一个更简单的表达式中它会有。这取决于您正在使用的RDBMS实现以及数据库中值的分布。

答案 2 :(得分:1)

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