- ベストアンサー
SQL WHERE句の分岐方法について
- SQL Server 2005を使用しています。WHERE句の分岐方法について教えてください。具体的には、都道府県と血液型のいずれかがNullでも条件に合致していれば抽出したいです。
- 下記のコードでは、Null = Nullを認識していないため、条件に合致しない場合も抽出されません。どのように記述すれば条件に合致するデータを抽出できるでしょうか。
- 要点:SQL Server 2005を使用して、WHERE句の条件分岐方法を知りたい。都道府県と血液型のいずれかがNullでも条件に合致すれば抽出したい。現在のコードではNull = Nullを認識していないため、条件に合致しないデータも抽出されない。
- みんなの回答 (5)
- 専門家の回答
質問者が選んだベストアンサー
SQL Sever は随分とご無沙汰。 で、非テストでアップ。 SQL Server のマニュアルを参照 http://technet.microsoft.com/ja-jp/library/ms184325.aspx ISNULL ( check_expression , replacement_value ) Nzは省略可。 ISNULLは省略不可。 replacement_valueを書いて下さい。 みたいですね。 なお、図の上がAND、図の下がOR。 どっちかが合っっていたらがORです。
その他の回答 (4)
- 山田 太郎(@f_a_007)
- ベストアンサー率20% (955/4574)
補足:テストに用いたSQL文 SELECT * FROM テーブル4 WHERE Nz([都道府県])="東京都" OR Nz([血液型])="A"; SQL Server の IsNull関数はAccessのNz関数と同じです。 ですから、SQL Server流に書けば次のようになります。 SELECT * FROM テーブル4 WHERE IsNull([都道府県])="東京都" OR IsNull([血液型])="A"; 要は、AND を OR と書けば良いということです。
補足
f_a_007 さん お世話になります。 ” 関数 isnull には引数が 2 個必要です。 ” というエラーメッセージが表示されてしまうのですが、 何か足りないところがあるのでしょうか?
- 山田 太郎(@f_a_007)
- ベストアンサー率20% (955/4574)
- mitoneko
- ベストアンサー率58% (469/798)
nullの扱いは、めんどくさいんです。null=nullではありませんから・・・ 一つずつ整理して扱うのが一番簡単かな。 条件が成立する場合を、nullを含めて列挙すると 都道府県が一致して、且つ、血液型が一致 都道府県がnullで、血液型が一致 血液型がnullで、都道府県が一致 と指定している物とおもいます。 これを全部、素直に条件に書けば終わりです。 where (都道府県=@A and 血液型=@B) or (都道府県 is null and 血液型=@B) or (血液型 is null and 都道府県=@A) で、いけると思いますよ。 もし、@Aや@Bがnullの場合も含むなら、その条件も列挙して追加すればOKです。でも、@Aと@Bがnullの場合に関しては、どちらかというと、ホスト言語側でSQLを構築する際に条件を省くようにプログラミングする方が、全体的に簡単になると思います。SQLの条件パターンがかなり増えますので。
補足
mitoneko さん お世話になります。 大変申し訳ございません。 都道府県、血液型というのは、わかりやすく記述するために書いたコードで、@A、@B は どちから1つしか値は入らず、必ずどちらかは、空白もしくはNull になる感じなのです。 IF @A = Null THEN dbo.テスト.血液型 = @B ELSE dbo.テスト.都道府県 = @A ENDIF WHERE句に上記のようなコードが書ければいいのですが、エラーになってしまいます。(もしかしたら書けるんでしょうか?!) パラメータをもう一つ増やして @C IF @C = 1 THEN dbo.テスト.都道府県 = @A ELSE dbo.テスト.血液型 = @B ENDIF というのも考えたのですが、やっぱりエラーに;;(もしかして書き方が間違えてるだけ?!) そこで、考え出したのが、 (IsNull(@A,dbo.テスト.都道府県) = dbo.テスト.都道府県) AND (IsNull(@B,dbo.テスト.血液型) = dbo.テスト.血液型 でした。しかしデータが空白、Nullのものが抽出できずに困っていたところでした。 以上のことを考えても、ご紹介をいただいた where (都道府県=@A and 血液型=@B) or (都道府県 is null and 血液型=@B) or (血液型 is null and 都道府県=@A) という書き方になってしまいますでしょうか? 何卒よろしくお願いいたします。
- 山田 太郎(@f_a_007)
- ベストアンサー率20% (955/4574)
>都道府県、血液型、両方に何かしらのデータが入っているものしか抽出してきません。 >どちらかの条件が合致していれば、抽出したいのですが・・・。 1 * 1 = 1 <-抽出 1 * 0 = 0 <-非抽出 0 * 1 = 0 <-非抽出 1 + 1 = 2 <-抽出 1 + 0 = 1 <-抽出 0 + 1 = 1 <-抽出 こういうことでは・・・。
お礼
f_a_007 さん、お世話になります。 (@A is null or dbo.テスト.都道府県 = @A) and (@B is null or dbo.テスト.血液型 = @B) 上記で実現できました。 みなさんのご助言でここまで到達できました。 ありがとうございました。