• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:SQL WHERE句 分岐?)

SQL WHERE句の分岐方法について

このQ&Aのポイント
  • SQL Server 2005を使用しています。WHERE句の分岐方法について教えてください。具体的には、都道府県と血液型のいずれかがNullでも条件に合致していれば抽出したいです。
  • 下記のコードでは、Null = Nullを認識していないため、条件に合致しない場合も抽出されません。どのように記述すれば条件に合致するデータを抽出できるでしょうか。
  • 要点:SQL Server 2005を使用して、WHERE句の条件分岐方法を知りたい。都道府県と血液型のいずれかがNullでも条件に合致すれば抽出したい。現在のコードではNull = Nullを認識していないため、条件に合致しないデータも抽出されない。

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

  • ベストアンサー
回答No.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です。

kyokotan12
質問者

お礼

f_a_007 さん、お世話になります。 (@A is null or dbo.テスト.都道府県 = @A) and (@B is null or dbo.テスト.血液型 = @B) 上記で実現できました。 みなさんのご助言でここまで到達できました。 ありがとうございました。

全文を見る
すると、全ての回答が全文表示されます。

その他の回答 (4)

回答No.4

補足:テストに用いた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
質問者

補足

f_a_007 さん お世話になります。 ” 関数 isnull には引数が 2 個必要です。 ” というエラーメッセージが表示されてしまうのですが、 何か足りないところがあるのでしょうか?

全文を見る
すると、全ての回答が全文表示されます。
回答No.3

補足: And と Or の違い。

kyokotan12
質問者

補足

f_a_007 さん お世話になります。 わざわざ画像をご用意していただきましてありがとうございます。 1つのパラメータで その値がNull か そうでないかで、条件自体を変えたいというのが趣旨でした。 OR にすると条件になるということでしょうか?

全文を見る
すると、全ての回答が全文表示されます。
  • mitoneko
  • ベストアンサー率58% (469/798)
回答No.2

 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
質問者

補足

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) という書き方になってしまいますでしょうか? 何卒よろしくお願いいたします。

全文を見る
すると、全ての回答が全文表示されます。
回答No.1

>都道府県、血液型、両方に何かしらのデータが入っているものしか抽出してきません。 >どちらかの条件が合致していれば、抽出したいのですが・・・。 1 * 1 = 1 <-抽出 1 * 0 = 0 <-非抽出 0 * 1 = 0 <-非抽出 1 + 1 = 2 <-抽出 1 + 0 = 1 <-抽出 0 + 1 = 1 <-抽出 こういうことでは・・・。

全文を見る
すると、全ての回答が全文表示されます。

関連するQ&A

  • SQL Server Where句 Case文

    お世話になります。 Where句のCase文でお尋ねしたいことがあります。 ----------------------------------------------------- WHERE (A = @A) AND (B = @B) AND (C = @C) AND CASE WHEN @D = 0 THEN (dbo.TEST.D = dbo.TEST.D) '全データを WHEN @D = 1 THEN (dbo.TEST.D = 1) '値が1のデータを WHEN @D = 2 THEN (dbo.TEST.D = Is Null) 'データがNull のものを END AND (E = @E) AND (F = @F) AND (G = @G) AND (H = @H) AND CASE WHEN @I = 0 THEN (dbo.TEST.I = dbo.TEST.I) WHEN @I = 1 THEN (dbo.TEST.I = 1) WHEN @I = 2 THEN (dbo.TEST.I = Is Null) END AND (J = @J) ........ ........ ----------------------------------------------------- 上記のように CASE 文で パラメータの値により条件を変えたいのですが、なかなかうまくいきません。こんな記述の仕方ではダメということは薄々わかっているのですが、このようなCASE文をうまく動作させるにはどのように記述すればいいでしょうか? よろしくお願いいたします。

  • T-SQL パラメータがNULLの場合条件含めず

    お世話になります。 SQL Server での T-SQLのWhere句のパラメータがNullであった場合に これをWhere句から除外したいのですが・・・ 今まで、こういう場合には、SQL文をプログラム上で作成してそのSQL文を ソースにしてきたのですが、動作速度や汎用性を考えてストアドプロシジャーを使用するのが今後の為と思いこちらで質問させていただきました。 例えば・・・条件のところから WHERE     IF @パラメータ1 Is Not Null         (dbo.TEST.A =< @パラメータ1) AND     IF @パラメータ2 Is Not Null         (dbo.TEST.B =< @パラメータ2) AND このように記述してみたのですが、WHEREが記述された後ではダメなようで・・・次に WHERE     CASE         WHEN @パラメータ1Is Not Null THEN (dbo.TEST.A = @パラメータ1) AND         WHEN @パラメータ2Is Not Null THEN (dbo.TEST.B = @パラメータ2) AND     END 上記にように記述してもやはりエラーが。 WHERE句の後にパラメータを評価し、WHERE句に含めるか、 含めないか記述するにはどうすればいいでしょうか? 初歩的な事かもしれませんが、何卒よろしくお願いいたします。

  • SQLのWHERE句を条件によって追加したい

    SQLのWHERE句にパラメータで渡された値がnullでない場合は条件に 含めるようにしたいのですが、書き方が分かりません。 CASEを使って書いてもエラーになってしまいます。 SELECT 項目1 ,項目2 FROM テーブル WHERE 条件1 = パラメータ1 AND 条件2 = パラメータ2 -- パラメータ3がnullでない場合は下記条件を付けたい AND 条件3 = パラメータ3 使っているのはpostgresqlです。 よろしくお願いします。

  • SQL2000のWHERE句について・・・

    VARCHAR(7)のフィールドがあります。 最初の二桁を地区、次の二桁を五十音、最後の三桁を商品コードと仮定します。 そこで問題なんですが、五十音の'01'から'20'を抽出したい場合にはどのようなWHERE句を書いたらよろしいのでしょうか? ご解答宜しくお願いします。

  • なぜ、WHERE句とHAVING句があるのか?

    なぜ、WHERE句とHAVING句があるのか? SQLを学んでいる時に、疑問に思ったことがあります。 それは、「なぜ、WHERE句とHAVING句があるのか?」ということです。 この2つは、 ・WHERE句 → 表から取り出す行の条件を指定 ・GROUP BY句 → グループ化した結果から取り出す行の条件を指定 という違いがあることは分かっています。 ですが、おなじ「行のかたまりに対する抽出条件」を指定しているのに、 なぜ、わざわざ2つに分ける必要があったのでしょうか? 分けないと不都合が生じるのでしょうか。 もし、明瞭簡潔に説明できる方がいらっしゃいましたら、教えていただけないでしょうか。

  • Oracle SQLの、where句内の条件文について教えてください。

    Oracle SQLの、where句内の条件文について教えてください。 下記SQLの(1)と(2)の記述文を教えてください。 (1)例:owner = sys,admin ownerがsysまたは、adminを抽出 (2)例:column_name = '*aaa*' column_nameに「aaa」が含まれているデータ SELECT owner, table_name,column_name FROM all_tab_columns WHERE (1)(Ownerを複数指定)   and (2)(column_nameに、●●が含まれるデータ)

  • WHERE句の制限の有無について

    下記の様なWHERE句を使っていますが、注釈の部分を生かす 極端に時間がかかるようになってしまいます。 (注釈は他の行でも大丈夫です、2~3行殺せば早くなります) なにか制限でもあるのでしょうか? WHERE u.締日コード = @締日コード AND u.入庫日付 <= @終了日付 AND u.部門コード = isnull(@部門コード,u.部門コード) AND u.分類 in ('輸入','輸出') AND u.分類 = isnull(@分類,u.分類) AND u.仕訳コード = isnull(@仕訳コード,u.仕訳コード) AND u.商社 = isnull(@商社,u.商社) --下記を復活すると遅くなる(4秒→38秒) --AND u.保管河岸コード =isnull(@保管河岸コード,u.保管河岸コード) --AND u.品名コード =isnull(@品名コード,u.品名コード) AND ( u.在庫員数 <> 0 or ISNULL(a.当期出庫員数,0) <> 0 or ISNULL(b.出庫員数,0) <> 0 or u.在庫重量 <> 0 or ISNULL(a.当期出庫重量,0) <> 0 or ISNULL(b.出庫重量,0) <> 0 )

  • SQLのSELECT 分岐について

    表題ですが SELECT ユーザID,パスワード  WHERE パスワードがNULLの場合は ユーザIDだけを抽出 パスワードがNULLではなければ ユーザIDとパスワードを抽出する っといったSQLを作成しようと考えていますが どうやったら作成できるかわかりません。

  • sql文のwhere句について

    <環境>sqlserver SQLでパラメータが空白であれば全件取得、パラメータに値が設定されている場合には 条件にHITするデータを抽出したいのですが、一本のクエリで抽出することができるのでしょうか? 空白時パラメータは以下のとおり入ってきます。 @no="" …完全一致 @name="%%" …部分一致 例) SELECT * FROM テーブル WHERE (NO = @no) and ((@name IS NULL) OR (@name IS NOT NULL) AND (NAME LIKE @name)) NAMEは上記クエリにて取得できています。 NOのところはどのようにすればよいでしょうか?

  • where条件内のin句について

    質問です。 where code in(select code from list where ....) ------------------------------------------ といったwhere句がある場合ですが、 in句でヒットしている件数が5000件を超えているため SQLを発行してもタイムアウトでエラーになります。 何か回避策はないでしょうか? よろしくお願いします。

このQ&Aのポイント
  • 残高証明書の発行は、常陽銀行の口座店(取引店)で可能です。
  • 残高証明書の発行は、常陽銀行の口座店以外でも可能です。
  • 常陽銀行のサービス・手続きについての質問です。
回答を見る