0

我想使用CASEDATE Type inWHERE子句,所以什么时候@birthFrom@birthTo什么时候NULL返回所有记录。

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 null. 请注意与is相对的使用=

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

有关更多详细信息,请参阅有关三值逻辑的 Wikipedia 文章

一种更简单的方法是完全省略这种情况:

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

CASE您的陈述有一个错误,您已添加@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 回答