我想在CASE
子句中使用带有日期类型的WHERE
,因此当@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 )
我的问题是:当我执行上面的代码时没有选择记录
有什么建议吗?
答案 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 )