2016-09-17 11 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の場合、準備は自動的にis nullになりますが、なぜ動作していないのかわかりません。

ここでは奇妙な観察です。私は、SQLサーバーのために戸田の値を持つSQLを入力すると、それが動作:

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

を、私は同じクエリを試してみて、FIRST_NAME =ボブとLAST_NAME {ヌル}のパラメータに値を渡すとき。それは動作しません。

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

デバッグをオンにして、あなたが正しいかどうかを確認してください。 – Jens

+0

ええとデバッグを試みましたが、DBIの準備機能を実行すると永遠に、Eclipseが応答を停止します。 –

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

最初の2つのコマンドは、それらに固執します。 3番目は構文エラーです.4番目は試したもので、何も返されません。

DBIのマンページには、このケースについて少し話しているNULL値のセクションがあります。

+0

ありがとうございます、私は別々にwhere句を作成する必要があります。 –

関連する問題