2016-09-17 3 views
0

Я пытаюсь получить счетчик из базы данных SQL Server и дает 0 для полей с нулевыми значениями. Ниже я использую.Почему selectrow_array не работает с нулевыми значениями в where где

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); 

Это возвращает 0, если любое значение null в базе данных. Я знаю, что подготовка автоматически делает это is null, если переданный параметр undef, но я не знаю, почему он не работает.

Так что это странное наблюдение. Когда я печатаю SQL со значениями в Тода для сервера SQL, он работает:

SELECT count(*) from customer where first_name = 'bob' and last_name is null 

, но когда я пытаюсь тот же запрос и передать значения в параметре для first_name = боб и last_name {NULL}. это не работает.

SELECT count(*) from customer where first_name = ? and last_name = ? 
+0

Включить Отладка и посмотреть, если вы правы – Jens

+0

Да, я пробовал отлаживать, но когда я вхожу в функцию подготовки DBI, она берет навсегда, а затмение перестает отвечать. –

+1

«Я знаю, что подготовка автоматически делает ее« пустой »- нет, это не так. – melpomene

ответ

0

Итак, вот что я сделал. Я добавил оператор or field is null с каждым полем, если значение равно undef.

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); 

Если у кого-то есть лучшее решение, отправьте его.

3

Для NULL в предложении WHERE вам просто нужен другой запрос. Я пишу их ниже друг друга, так что вы можете определить разницу:

...("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); 

Первые две команды работают, придерживайтесь этих. Третий - синтаксическая ошибка, четвертая - это то, что вы пытались и которое действительно ничего не возвращает.

В man-странице DBI есть раздел значений NULL, который говорит об этом случае немного больше.

+0

Спасибо, вы правы, мне нужно создать предложение where отдельно. –

Смежные вопросы