- ベストアンサー
T-SQLパラメータのNULL条件を除外する方法
- T-SQLのWhere句でパラメータがNullの場合、条件を除外する方法を教えてください。
- 通常、このような場合はSQL文を作成してソースに組み込んでいますが、ストアドプロシージャの使用を検討しています。
- 現在試している方法としては、WHERE句の後に条件を記述する方法とCASE文を使用する方法ですが、どちらもエラーが発生しています。どのようにすれば良いでしょうか?
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
やりたいことを実現する方法としては、 where (@パラメータ1 is null or dbo.TEST.A = @パラメータ1) and (@パラメータ2 is null or dbo.TEST.B = @パラメータ2) とか where isnull(@パラメータ1,dbo.TEST.A) = dbo.TEST.A and isnull(@パラメータ2,dbo.TEST.B) = dbo.TEST.B とかcaseを使わない方法もいろいろあります。 CASEを使うのなら、 WHERE CASE WHEN @パラメータ1Is Not Null THEN @パラメータ1 ELSE dbo.TEST.A END = dbo.TEST.A AND CASE WHEN @パラメータ2Is Not Null THEN @パラメータ2 else dbo.TEST.B END = dbo.TEST.B とか。 TSQLのIFは条件によって、処理を分岐させますが、 CASEは条件によって、返す「値」を別々にします。 CASE~END = xxx 等のように書かないといけないです。 (という説明で分ってもらえるかな?あまり自信ないですけど。) なお、ANo.1の回答は、 左辺は、1。 右辺は、 パラメタがNull ならば 1 パラメタがNullでなければ (パラメタと値が等しければ1、さもなくば0) この結果の左辺と右辺を比較しています。
その他の回答 (2)
- Siegrune
- ベストアンサー率35% (316/895)
ANo.2です。 補足いただいていましたので。 >Siegrune さん お世話になります。 >もうひとつお教えくださいませ。 > >IsNull(@A,dbo.TEST.A) >= dbo.TEST.A > >上記のように、不等号が >= の場合も上記の式でいいんでしょうか? はい。そうです。 >dbo.TEST.A >= dbo.TEST.A となる感じだと思うのですが、 はい。@AがNullの場合は、その通りになります。
お礼
Siegrune さん 大変お世話になります。 細かく式のご提示していただき大変わかりやすく 納得できる回答、ありがとうございました。
- nora1962
- ベストアンサー率60% (431/717)
CASE文を使えば可能です。 WHERE 1 = CASE WHEN @パラメータ1Is Null THEN 1 ELSE CASE WHEN dbo.TEST.A = @パラメータ1 THEN 1 ELSE 0 END END
補足
nora1962 さん お世話になります。 CASE を使えばできるんですね! しかしご指定いただいた式がいまいちわかりません @パラメータ1がNullじゃなかったら 1 を実行すると いうことでしょうか? WHERE 1 = CASE WHEN @パラメータ1Is Null THEN 1 ELSE CASE WHEN dbo.TEST.A = @パラメータ1 THEN 1 ELSE 0 END END
お礼
Siegrune さん お世話になります。 ご教授いただきました T-SQLのIsNull関数などの仕様を調べて、初めてこういう使い方があるんだと知りました。 (@パラメータ1 is null or dbo.TEST.A = @パラメータ1)にしても、どちらかが真の場合、真の式を実行して他は無視できるのだと知りました。 CASE WHEN @パラメータ1Is Not Null THEN @パラメータ1 ELSE dbo.TEST.A END = dbo.TEST.A CASEにしても 最後のところを = dbo.TEST.A こんな感じで記述するんだと初めて知りました。 今回の質問にたいしてのご回答はわたくしにとって、大変大きなものだと実感しております ありがとうございました。大変勉強になりました。
補足
Siegrune さん お世話になります。 もうひとつお教えくださいませ。 IsNull(@A,dbo.TEST.A) >= dbo.TEST.A 上記のように、不等号が >= の場合も上記の式でいいんでしょうか? dbo.TEST.A >= dbo.TEST.A となる感じだと思うのですが、 何卒よろしくお願いいたします。