在WHERE子句中使用带有DATE类型的CASE

时间:2012-09-15 15:46:52

标签: sql sql-server sql-server-2008 tsql case

我想在CASE子句中使用带有日期类型的WHERE,因此当@birthFrom@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 )

我的问题是:当我执行上面的代码时没有选择记录

有什么建议吗?

2 个答案:

答案 0 :(得分: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 article on three valued logic

更简单的方法是完全省略案例:

where   (@birthFrom is null or @birthFrom <= birth)
        and (@birthTo is null or birth <= @birthTo)

答案 1 :(得分: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 )