• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:T-SQL パラメータがNULLの場合条件含めず)

T-SQLパラメータのNULL条件を除外する方法

このQ&Aのポイント
  • T-SQLのWhere句でパラメータがNullの場合、条件を除外する方法を教えてください。
  • 通常、このような場合はSQL文を作成してソースに組み込んでいますが、ストアドプロシージャの使用を検討しています。
  • 現在試している方法としては、WHERE句の後に条件を記述する方法とCASE文を使用する方法ですが、どちらもエラーが発生しています。どのようにすれば良いでしょうか?

質問者が選んだベストアンサー

  • ベストアンサー
  • Siegrune
  • ベストアンサー率35% (316/895)
回答No.2

やりたいことを実現する方法としては、 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) この結果の左辺と右辺を比較しています。

kyokotan12
質問者

お礼

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 こんな感じで記述するんだと初めて知りました。 今回の質問にたいしてのご回答はわたくしにとって、大変大きなものだと実感しております ありがとうございました。大変勉強になりました。

kyokotan12
質問者

補足

Siegrune さん お世話になります。 もうひとつお教えくださいませ。 IsNull(@A,dbo.TEST.A) >= dbo.TEST.A 上記のように、不等号が >= の場合も上記の式でいいんでしょうか? dbo.TEST.A >= dbo.TEST.A となる感じだと思うのですが、 何卒よろしくお願いいたします。

その他の回答 (2)

  • Siegrune
  • ベストアンサー率35% (316/895)
回答No.3

ANo.2です。 補足いただいていましたので。 >Siegrune さん お世話になります。 >もうひとつお教えくださいませ。 > >IsNull(@A,dbo.TEST.A) >= dbo.TEST.A > >上記のように、不等号が >= の場合も上記の式でいいんでしょうか? はい。そうです。 >dbo.TEST.A >= dbo.TEST.A となる感じだと思うのですが、 はい。@AがNullの場合は、その通りになります。

kyokotan12
質問者

お礼

Siegrune さん 大変お世話になります。 細かく式のご提示していただき大変わかりやすく 納得できる回答、ありがとうございました。

  • nora1962
  • ベストアンサー率60% (431/717)
回答No.1

CASE文を使えば可能です。 WHERE 1 = CASE WHEN @パラメータ1Is Null THEN 1 ELSE CASE WHEN dbo.TEST.A = @パラメータ1 THEN 1 ELSE 0 END END

kyokotan12
質問者

補足

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

関連するQ&A