CREATE PROCEDURE dbo.sample @start DATE,@end DATE,@type VARCHAR(5)
AS
SELECT o.O_Id,
o.Sale_Price,
o.Private_Band,
c.Date_of_Purchase,
c.Date_Redeemed,
c.Type,
c.Points_Issued,
o.Date_of_Purchase
FROM Order_Details o,
Transaction_Historys c
WHERE CASE
WHEN o.Date_of_Purchase BETWEEN @start AND @end
AND (c.Type = @type) THEN 1
WHEN c.Type = @type THEN 1
ELSE 0
END = 1
GO
EXECUTE dbo.sample @type=NULL,@start='2012-03-01',@end='2012-03-30'
GO
当我用 @type=null
我没有得到数据。我需要处理以下两种情况
INput CASE1=wen @type is NULL-> WHERE c.Date_Redeemed BETWEEN @Start AND @End-- this should execute
If CASE2=wen @start,@end is NULL->WHERE c.Type=@type-- this should execute
重写。
WHERE
o.Date_of_Purchase BETWEEN @start AND @end OR
c.Type = @type OR
(@type IS NULL and @start is null)
OR (@type IS NULL and @start is null)
正如我所评论的,只有 IS NULL
当处理空值时,可以用来返回true。如果@start为空,那么 o.Date_of_Purchase BETWEEN @start AND @end
将始终为false,所以将使用@type代替。如果@type为空,则使用@start@end。如果这两个条件都是空的,那么前两个条件总是假的,所以你只需要决定如果这两个条件都是空的该怎么办。如果所有的数据都被提供,你可能还想要一个不同的行为,在这种情况下,你可以考虑使用显式。
WHERE
(c.Type = @type AND o.Date_of_Purchase BETWEEN @start AND @end) OR
(@start IS NULL AND c.Type = @type) OR
(@type IS NULL and o.Date_of_Purchase BETWEEN @start AND @end) OR
(@start IS NULL AND @type IS NULL)
在这种情况下,你可以看一下是否明确: