我希望能够将某些内容传递给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);
答案 0 :(得分:4)
是;一个相关的技巧是,如果你有X个潜在的过滤器,其中一些是可选的,就是让模板说" AND ( ?=-1 OR some_field = ? ) "
,并创建一个包装执行调用并绑定所有秒的特殊函数。 (在这种情况下,-1是一个特殊值,意思是“忽略此过滤器”)。
Paul Tomblin的更新:我编辑了答案以包含评论中的建议。
答案 1 :(得分:2)
所以你依靠布尔表达式的短路语义来调用你的IS NULL
条件?这似乎有效。
一个有趣的观点是,查询优化器应该考虑一个没有参数的常量表达式1 = 0
。在这种情况下,由于优化器在执行时间之前不知道表达式是常量true
还是false
,这意味着它无法将其分解出来。它必须评估每一行的表达式。
因此,可以假设这为查询添加了较小的成本,相对于使用非参数化常量表达式所需的成本。
然后将OR
与IS NULL
表达式结合使用也可能对优化程序产生影响。它可能决定它不能从deleted_on
上的索引中受益,而在一个更简单的表达式中它会有。这取决于您正在使用的RDBMS实现以及数据库中值的分布。
答案 2 :(得分:1)
我认为这是一种合理的方法。它很好地遵循了正常的过滤模式,并且应该提供良好的性能。