• ベストアンサー
  • すぐに回答を!

SQL WHERE句 分岐?

  • 質問No.8243803
  • 閲覧数1385
  • ありがとう数4
  • 気になる数0
  • 回答数5
  • コメント数0

お礼率 59% (106/178)

SQL Server 2005 を使っております。

WHERE句の分岐といいますか、記述の方法がわからないのですが、下記がその部分になります。
下記のコードを実行すると、都道府県、血液型、両方に何かしらのデータが入っているものしか抽出してきません。都道府県、血液型、どちらかの値がNullの場合でも、どちらかの条件が合致していれば、抽出したいのですが、どう記述すればよろしいでしょうか?

下記のコードが Null = Null を認識していれば このコードでも抽出してくるんでしょうが、
Null = Null だと抽出しないんですね。

何卒よろしくお願いいたします。


WHERE

(IsNull(@A,dbo.テスト.都道府県) = dbo.テスト.都道府県)
AND
(IsNull(@B,dbo.テスト.血液型) = dbo.テスト.血液型

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

  • 回答No.5
  • ベストアンサー

ベストアンサー率 20% (952/4556)

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です。
お礼コメント
kyokotan12

お礼率 59% (106/178)

f_a_007 さん、お世話になります。


(@A is null or dbo.テスト.都道府県 = @A)
and
(@B is null or dbo.テスト.血液型 = @B)

上記で実現できました。
みなさんのご助言でここまで到達できました。
ありがとうございました。
投稿日時:2013/08/31 20:07

その他の回答 (全4件)

  • 回答No.4

ベストアンサー率 20% (952/4556)

補足:テストに用いた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 と書けば良いということです。
補足コメント
kyokotan12

お礼率 59% (106/178)

f_a_007 さん お世話になります。

” 関数 isnull には引数が 2 個必要です。 ”
というエラーメッセージが表示されてしまうのですが、
何か足りないところがあるのでしょうか?
投稿日時:2013/08/31 19:45
  • 回答No.3

ベストアンサー率 20% (952/4556)

補足: And と Or の違い。
補足コメント
kyokotan12

お礼率 59% (106/178)

f_a_007 さん お世話になります。

わざわざ画像をご用意していただきましてありがとうございます。

1つのパラメータで その値がNull か そうでないかで、条件自体を変えたいというのが趣旨でした。

OR にすると条件になるということでしょうか?
投稿日時:2013/08/31 19:39
  • 回答No.2

ベストアンサー率 58% (458/780)

 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の条件パターンがかなり増えますので。
補足コメント
kyokotan12

お礼率 59% (106/178)

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)

という書き方になってしまいますでしょうか?

何卒よろしくお願いいたします。
投稿日時:2013/08/31 19:22
  • 回答No.1

ベストアンサー率 20% (952/4556)

>都道府県、血液型、両方に何かしらのデータが入っているものしか抽出してきません。
>どちらかの条件が合致していれば、抽出したいのですが・・・。

1 * 1 = 1 <-抽出
1 * 0 = 0 <-非抽出
0 * 1 = 0 <-非抽出

1 + 1 = 2 <-抽出
1 + 0 = 1 <-抽出
0 + 1 = 1 <-抽出

こういうことでは・・・。
結果を報告する
このQ&Aにはまだコメントがありません。
あなたの思ったこと、知っていることをここにコメントしてみましょう。
関連するQ&A

その他の関連するQ&Aをキーワードで探す

ピックアップ

ページ先頭へ