我看到的一個方法是這樣的:
兩段代碼如下:
//這段代碼會報錯
where
case when (@a = null)
then 1 = 1
else @a=a
and b=@b
//這樣寫是正確的
where
(1 = (CASE WHEN @a IS NULL THEN 1 ELSE 0 END)
OR a=@a )
AND b=@b
附上原文如下:sqlserver中where條件加判斷
我看到很多方法都是在折騰CASE WHEN THEN
但實際上如果相對複雜一點,這樣寫會造成
- 閱讀困難
- case when then 未必會有用
其實可以優化爲:
//優化前:
select * from table
where
(1 = (CASE WHEN @a IS NULL THEN 1 ELSE 0 END)
OR a=@a )
AND b=@b
//優化後:
DECLARE @a varchar(50)
select * from table
where a=ISNULL(@a,1)
如果只是在where字句後加是否爲null的判斷的話 完全可以使用ISNULL()函數來處理。
略複雜一點可以這樣:
exp:
//業務場景:查詢整年銷售的一個累計金額,若傳過來的查詢時間爲空的話,則默認查詢從該年一月份到十二月份的銷售總金額。
//若查詢時間不爲空的話,則查詢傳過來的開始時間和結束時間之間的銷售總金額。
DECLARE @startTime datetime=null --搜索的開始時間
DECLARE @endTime datetime=null --搜索的結束時間
--本年最後一天
DECLARE @LastDayOfTheYear DATETIME=DATEADD(year, datediff(year, 0, dateadd(year, 1, getdate())), -1)
DECLARE @TheLastDay DATETIME=dateadd(year, datediff(year, 0, dateadd(year, 1, @endTime)), -1)
--本年第一天
DECLARE @FirstDayOfTheYear DATETIME=DATEADD(year, datediff(year, 0, getdate()), 0)
DECLARE @FirstDay DATETIME=dateadd(year, datediff(year, 0, @startTime), 0)
--本年累計金額 臨時表
SELECT op.OrderID,SUM((op.Quantity-ISNULL(op.ReturnNum ,0))*op.UnitPrice) AS yearmoney INTO #CumulativeAmount
FROM OrderProduct op
LEFT JOIN Orders o ON op.OrderID=o.OrderID
WHERE o.FinishTime<ISNULL(@TheLastDay,@LastDayOfTheYear)
AND o.FinishTime>ISNULL(@FirstDay,@FirstDayOfTheYear)
GROUP BY op.OrderID