2016-09-17 5 views
0

SQL 서버 데이터베이스에서 카운트를 가져 오는 중이고 null 값이있는 필드에 대해 0이 제공됩니다. 아래는 제가 사용하고있는 것입니다.selectrow_array가 where 절의 null 값과 작동하지 않는 이유

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가 자동으로 이되지만, 왜 작동하지 않는지는 알 수 없습니다.

여기 이상한 관찰입니다. 내가 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

그래서 여기에 내가 한 것입니다. 값이 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); 

더 좋은 해결책이있는 사람은 누구나 게시하십시오.

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 값 섹션이 있습니다.

+0

고마워, 네가 맞다. 나는 where 절을 별도로 만들어야한다. –