我正在尝试从SQL服务器数据库中获取计数,并且它为具有空值的字段提供0。以下是我正在使用的内容。
my $sql = q{SELECT count(*) from customer where first_name = ? and last_name = ?};
my @bind_values = ($first_name, $last_name);
my $count = $dbh->selectrow_array($sql, undef, @bind_values);
如果数据库中的任何值为null,则返回0。我知道如果传递的参数是undef,则prepare会自动生成is null
,但我不知道它为什么不起作用。
所以这是奇怪的观察。当我在Toda for SQL server中键入带有值的SQL时,它可以工作:
SELECT count(*) from customer where first_name = 'bob' and last_name is null
但是当我尝试相同的查询并在first_name = bob和last_name {null}的参数中传递值时。它不起作用。
SELECT count(*) from customer where first_name = ? and last_name = ?
答案 0 :(得分:3)
对于WHERE子句中的NULL,您只需要一个不同的查询。我把它们写在彼此之下,所以你可以发现差异:
...("select * from test where col2 = ?", undef, 1);
...("select * from test where col2 is ?", undef, undef);
...("select * from test where col2 is ?", undef, 1);
...("select * from test where col2 = ?", undef, undef);
前两个命令工作,坚持这些。第三个是语法错误,第四个是你尝试过的,确实没有返回任何内容。
DBI联机帮助页有一段NULL值,可以更多地讨论这种情况。
答案 1 :(得分:0)
所以,这就是我所做的。如果值为undef,我在每个字段中添加了or field is null
语句。
my $sql = q{SELECT count(*) from customer where (first_name = ? or (first_name is null and ? = 1)) and (last_name = ? or (last_name is null and ? = 1))};
my @bind_values = ($first_name, defined($first_name)?0:1, $last_name, defined($last_name)?0:1);
my $count = $dbh->selectrow_array($sql, undef, @bind_values);
如果有人有更好的解决方案,请发布。