dポイントプレゼントキャンペーン実施中!

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)を使用しているのに意味がありません。
良いお知恵は無いでしょうか。

よろしくお願いします。

A 回答 (4件)

A=Nullは


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

補足。


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

参考URL:http://msdn.microsoft.com/library/ja/default.asp …
    • good
    • 0

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をちゃんと設定していません。
    • good
    • 0

うーん、それでもいけそうな感じなんですが。


'NULL' IS NULL とかになってませんよね?

代案としては
A = '1' and
B = ISNULL(引数,B) and
C = ISNULL(引数,C) and
D = ISNULL(引数,D)
とかどうでしょう。
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

関連するカテゴリからQ&Aを探す