在Perl模块中,我有这样的代码:
...
my $param = 123;
my $sql = "select id, name from obj where id = ?";
$sth = $DBH->prepare($sql) || die $DBH->errstr;
$sth->execute($param) || die $DBH->errstr;
...
whern param的值一切都很好,但在这个模块中有条件需要从表中选择所有行(在我的代码中为$ param = undef)
有没有人知道如何在不更改查询的情况下执行此操作?
THX!
答案 0 :(得分:2)
在不更改查询的情况下无法完成,因为无法使用'='将NULL与NULL进行比较,并且undef为NULL;你需要使用'is null'或'is not null'。在DBI中搜索“NULL值”,它将解释。
评论后修改:
如果我现在正确理解了问题,您可能希望根据Perl标量是否为undef来选择所有行或特定行。解决方案是:
my $sql = q/select something from table where ? is null or column = ?/;
$s->prepare($sql);
# here $param is undef for all rows and !undef for specific rows
$s->execute($param, $param);
答案 1 :(得分:0)
我通常更喜欢bohica提供的解决方案,但是Oracle可以做一些奇怪的优化,并且对查询进行一些调查可以使某些查询获得更好的性能,或者更糟糕。 (始终对任何解决方案进行基准测试)
select * from cust where cust_no = nvl(?, cust_no);
这将匹配cust_no =?设置绑定变量时,绑定变量为null时为cust_no = cust_no。 Oracle通常会优化cust_no = cust_no out,只返回所有行。