SqlSever中Where子句後進行條件判斷

我看到的一個方法是這樣的:
在這裏插入圖片描述
兩段代碼如下:

//這段代碼會報錯
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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章