SQLで複数の日付型の引数をand条件で結びたい方法

このQ&Aのポイント
  • SQLのSELECT文で複数の日付型の引数をand条件で結びたい場合、引数がnullの場合は検索したくないという条件もあります。
  • しかし、現在の方法では引数が何もセットされていない場合には値が0件で返ってしまいます。
  • この問題を解決するためには、引数がnullの場合にはその条件を無視するようにする必要があります。具体的には、(B = 引数 or 引数 is null)のような条件を使用します。
回答を見る
  • ベストアンサー

is null のandについて(日付型)

SQLのSELECTで困っています。 プロシージャに引数を渡してSELECTしようと考えています。 複数の日付(datetime)型の引数をand条件で結びたいです。 検索したくない場合はnullを渡す。 例) select A,B,C from XXX where A = '1' and (B = 引数 or 引数 is null) and (C = 引数 or 引数 is null) and (D = 引数 or 引数 is null) ===== B,C,D はdatetimeです。 この形ですと、B,C,D全ての引数に日付が入っていれば取得できる のですが一箇所でも引数に何もセットしないと値0件で帰ってきて しまいます。 せっかく(is null)を使用しているのに意味がありません。 良いお知恵は無いでしょうか。 よろしくお願いします。

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

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

A=Nullは Falseではなく、Nullになります なので、引数がNullのばあい、 B = 引数→Null なので (B = 引数 or 引数 is null) もNullになります。 Caseなどで場合わけするしかないのでは? B = Case 引数 IsNull then B else 引数 end とか。

その他の回答 (3)

回答No.4

補足。 NULL 値の比較(MSDN)より(参考リンク) ------ SET ANSI_NULLS をオンにすると、比較する式のどれかが NULL の場合、TRUE または FALSE は生成されず、UNKNOWN が返されます。認識できない値はそれ以外の値と論理的に比較できないためです。 ------

参考URL:
http://msdn.microsoft.com/library/ja/default.asp?url=/library/ja/acdata/ac_8_qd_06_7xir.asp
回答No.2

select A,B,C from XXX where A = '1' and (B = 引数 or 引数 is null) and (C = 引数 or 引数 is null) and (D = 引数 or 引数 is null) は、 select A,B,C from XXX where A = '1' and (引数 is null or (B = 引数 and C = 引数 and D = 引数)) に等しいんですけど、良いんですよね? 仮に良いという前提で・・ select A,B,C from XXX where A = '1' and (引数 = '' or 引数 is null or (B = 引数 and C = 引数 and D = 引数)) で、NULLだけでなく''(空文字列)も判定要素に加えたら、動きませんか? これで動くなら、引数を与える側が、NULLをちゃんと設定していません。

  • NYOI
  • ベストアンサー率58% (56/96)
回答No.1

うーん、それでもいけそうな感じなんですが。 'NULL' IS NULL とかになってませんよね? 代案としては A = '1' and B = ISNULL(引数,B) and C = ISNULL(引数,C) and D = ISNULL(引数,D) とかどうでしょう。

関連するQ&A

  • SQL where区で(-1)を使用したい

    SQL文のwhere区で(-1)を使用したいのですがどなたかアドバイスお願いします。 SQLをプロシージャにして検索条件を引数で渡そうと考えています。 検索したくない引数には(-1)を入れて渡したいです。 select * from X where X.1 = 'QQQ' and (引数 = -1 or X.2 = 引数) といった感じで、引数で(-1)を渡した場合 (-1 = -1 or X.2 = -1) となりwhere区で使用しない様作成したいと思っています。 この方法ではDATETIME型に対してはエラーとなるため出来ません。 良い方法は無いでしょうか。 よろしくお願いします。

  • ANDとかORとかを書く位置

    ネットで調べてみても見つからないので皆さんに質問させて下さい。 SQLで結合条件を記述する際、よく仕事現場で見かけるのは以下のような 書き方です。 SELECT うんたら FROM  かんたら WHERE  A = AAA AND   B = BBB OR   C = CCC しかし、個人的にこれは嫌いです。 何故なら結合条件はWHEREの配下に存在するものであり、WHEREと同列 ではないはずだからです。 なので、私が書くとこうなります。 SELECT うんたら FROM  かんたら WHERE  A = AAA AND     B = BBB OR     C = CCC もしくは、そんな書き方しませんが・・・。 SELECT うんたら FROM  かんたら WHERE  A = AAA     AND     B = BBB     OR     C = CCC ここで、最初に示した書き方に最もな理由が知りたいと思います。 好みの問題なのかもしれませんが・・・。 投稿時のインデントが上手くいかないのでいいように解釈して下さい(笑)

  • ストアドプロシージャの条件分岐に関して

    お世話になります。 以下の環境で開発を行っています。 言語:C#(.NET 2008) DB: SQL Server 2008 C#で作成した画面にて入力された値をパラメータで ストアドプロシージャに渡し、その値がNULLでない場合だけ WHERE句にレコード絞り込み条件を与えるSQL文を 考えているのですが、記述方法がわかりません。 (プロシージャ) --------------------------------------------- DECLARE @param1 = ''  -- 画面から渡されるパラメータ1 @param2 = ''   -- 画面から渡されるパラメータ2 SELECT * FROM TABLE1 A, TABLE2 B    -- (1) IF @param1 IS NOT NULL AND @param2 IS NOT NULL    -- ここから WHERE A.COLUMN1 = @param1 AND A.COLUMN2 = @param2 ELSE IF @param1 IS NOT NULL AND @param2 IS NULL WHERE A.COLUMN1 = @param1 ELSE IF @param1 IS NULL AND @param2 IS NOT NULL WHERE A.COLUMN2 = @param2              -- ここまで (2) AND A.COLUMN1 = B.COLUMN1       -- (3) AND A.COLUMN2 = B.COLUMN2      -- (4)   ------------------------------------------------ 上記の(1)から(4)までをうまく1つにまとめたかたちで記述することができません。 特に上記(2)の効率のよい正しい記述方法がわかりません。 どなたかご教授願えますか? よろしくお願いいたします。

  • NULL行の取得について

    教えてください。 Aはトランザクションテーブルです。 A 列1 列2 1 1 2 NULL 3 2 Bは種別テーブルです。 B 列1 列2 列3 aaa 1 あああ1 aaa 2 あああ2 aaa 3 あああ3 select A.列1 B.列3 from INNER JOIN B ON ( (A.列2 = B.列2 or A.列2 is null) and B.列1 = 'aaa') 上記のSQLを実行すると、 A.列1が2のような、列2がNULLだと、 1 あああ1 2 あああ1 2 あああ2 2 あああ3 3 あああ2 となってしまいます。 望む形としては、 1 あああ1 2 null 3 あああ2 としたいのですが。。。 何が悪いか、教えていただけませんでしょうか。 お願いします。

  • 否定条件回避

    お世話になります。 エラーデータチェックのSQLを作成していますが、 難航しています。 バージョン:Oracle10.2 Aテーブル  a1 b1 c1 a2 b2 a3 b3 c3    Bテーブル a1 b1 a2 gg a3 上のように2つのテーブルがあるとします。 2つのテーブルの各項目がエラーあるかどうかをチェックします。 上の場合は2行目のレコードがエラーとし、取得したいです。 結合条件はa,b,c。ただどれもNULLの場合があって、3つのうち必ずどれかが値が入っています。A.a1とB.a1があっていれば、正常データとします。 大量データため、WHERE句に否定条件はちょっと厳しいです。 自分が考えたのはMINUS 例:SELECT * FROM Aテーブル LEFT JOIN Bテーブル   ON (A.a = B.a OR A.b = B.b OR A.c = B.c) MINUS SELECT * FROM Aテーブル LEFT JOIN Bテーブル ((ON A.a = B.a OR (A.a IS NULL OR B.a IS NULL)) (AND A.b = B.b OR (A.b IS NULL OR B.b IS NULL)) (AND A.c = B.c OR (A.c IS NULL OR B.c IS NULL))) 後々考えたらやっぱり抜けるところがある気がします・・・ どなたかご教授いただけると助かります。 よろしくお願いします。

  • "and" と "or" の使い方について

    等位接続詞の件で、疑問がなのですが、 たとえば、A,B,C and D が可能であれば、 A,B,C or D は「AかBかCかD」という意味で 使用可能でしょうか? また、"and"と"or"を下記のように共存させることは 可能でしょうか? A,B and C or D お分かりの方、ぜひよろしくお願いします。

  • 日付の範囲検索で

    ACCESSで商品の販売管理システムを作っています。 商品マスタの中に、販売開始日、販売終了日のフィールドがあるのですが、常時販売している商品はこのフィールドは空になっています。 また、今まで販売していたけど近々終了する商品や、近々販売を開始するけど、終了が未定の商品は片方に日付が入り、もう片方は空になっています。 こういう状態で指定した日にちに販売されている商品の一覧を作りたいのですが、where の書き方が分かりません。 何も考えずに書くと、以下のようになると思います。 SELECT 商品マスタ.* FROM 商品マスタ WHERE (販売開始日 IS NULL AND 販売終了日 IS NULL) OR (販売開始日 IS NULL AND 販売終了日 >= #2003/12/15#) OR (販売開始日 <= #2003/12/15# AND 販売終了日 IS NULL) OR (販売開始日 <= #2003/12/15# AND 販売終了日 >= #2003/12/15#) ちょっと長いので、もっとスマートに書く事はできないものでしょうか。 よろしくお願いします。

  • 【初歩】 SELECT文で意図した照会結果が得られない。NULLの扱いは?

    var1 var2 ------------- abc  null ------------- abc  null ------------- abc  null ------------- のようになっているテーブルに対して、 (1) select * from mytable where var1 = 'abc' (2) select * from mytable where var1 = 'abc' and var2 is null などとやれば、3件全部照会できますが、 (3) select * from mytable where var1 = 'abc' and var2 != '1' (4) select * from mytable where var1 = 'abc' and var2 != 1 とやっても1件も出てこないのですが、なぜでしょうか? 「NULLだって1ではない」わけだから、3件照会できてくれないと 困るのですが・・・

    • ベストアンサー
    • MySQL
  • Oracle: PACKAGE BODY の分割

    業務用に10個以上作成したストアドプロシージャ/ファンクションをパッケージとしてまとめようとしています。保守性の観点から、PACKAGE BODY内の各ストアドを、以下のようなイメージで別々のファイルで管理したいと思っています。 が、PACKAGEとBODYの分割はできたものの、BODY内のストアドを別々にすると、エラーとなってしまいます。 そういうことはできないのでしょうか? [xxx_pkg.SQL] CREATE OR REPLACE PACKAGE xxx_pkg IS PROCEDURE procedure_a; PROCEDURE procedure_b; PROCEDURE procedure_c; END xxx_pkg; [xxx_pkg.procedure_a.SQL] PROCEDURE procedure_a IS -- aの処理 END procedure_a; [xxx_pkg.procedure_b.SQL] PROCEDURE procedure_b IS -- aの処理 END procedure_a; [xxx_pkg.procedure_c.SQL] PROCEDURE procedure_c IS -- aの処理 END procedure_c;

  • NULLを含む列の足し算

    NULLを含むA列、B列の合計を取得する方法を教えてください。 列の値がNULLだった場合は0として扱い、 列A 列B 合計 NULL 100 100 100 20 120 50 NULL 50 としたいのですが、 単純に SELECT A+B FROM XXX とすると 列A 列B 合計 NULL 100 NULL 100 20 120 50 NULL NULL となります。 NULL=0として扱う方法はないものでしょうか? 宜しくお願いします。

    • ベストアンサー
    • MySQL