0

CASEDATE 型 inWHERE句で使いたいので、 @birthFromorの場合@birthToNULL全レコードを返します。

DECLARE @birthFrom DATE= NULL --'19941012'
DECLARE @birthTo DATE= NULL --'20101012'

SELECT  *
FROM    dbo.bbmf
WHERE   birth BETWEEN ( CASE @birthFrom
                      WHEN NULL THEN birth
                      ELSE @birthFrom
                    END )
          AND     ( CASE @birthTo
                      WHEN NULL THEN birth
                      ELSE @birthTo
                    END )

私の問題は次のとおりです。上記のコードを実行すると、選択されたレコードがありません

なにか提案を?

4

2 に答える 2

2

caseが機能しない理由は、nullと等しくないためnullです。式null = nullは に評価されunknownます。例えば:

select case null when null then 1 else 2 end
-->
2

のように動作させることができますcase when x is nullisではなくの使用に注意してください=

declare @x int = null
select case when @x is null then 1 else 2 end
-->
1

詳細については、3 つの値を持つロジックに関するウィキペディアの記事を参照してください。

より簡単な方法は、ケースを完全に省略することです:

where   (@birthFrom is null or @birthFrom <= birth)
        and (@birthTo is null or birth <= @birthTo)
于 2012-09-15T15:49:10.657 に答える
0

CASEステートメントに1つの間違いがあり、@birthFrom代わりに追加しました@birthTo

WHERE   birth BETWEEN ( CASE @birthFrom
                      WHEN NULL THEN birth
                      ELSE @birthFrom
                    END )
          AND     ( CASE @birthFrom <----it should be @birthTo
-------------------------^^^^^^^^^^
                      WHEN NULL THEN birth
                      ELSE @birthTo
                    END )
于 2012-09-15T15:53:44.467 に答える