CASE WHEN 用法

sql語句判斷方法之一 
Case具備兩種格式。簡單Case函數和Case搜索函數。 
--簡單Case函數 
CASE sex 
WHEN '1' THEN '男' 
WHEN '2' THEN '女' 
ELSE '其餘' END 
--Case搜索函數 
CASE WHEN sex = '1' THEN '男' 
WHEN sex = '2' THEN '女' 
ELSE '其餘' END
sql


這兩種方式,能夠實現相同的功能。簡單Case函數的寫法相對比較簡潔,可是和Case搜索函數相比,功能方面會有些限制,好比寫判斷式。 
還有一個須要注意的問題,Case函數只返回第一個符合條件的值,剩下的Case部分將會被自動忽略。
函數

例子:
有一張表,裏面有3個字段:語文,數學,英語。其中有3條記錄分別表示語文70分,數學80分,英語58分,請用一條sql語句查詢出這三條記錄並按如下條件顯示出來(並寫出您的思路): 
大於或等於80表示優秀,大於或等於60表示及格,小於60分表示不及格。 
顯示格式: 
語文 數學 英語 
及格 優秀 不及格 
------------------------------------------
select
(case when 語文>=80 then '優秀'
when 語文>=60 then '及格'
else '不及格') as 語文,
(case when 數學>=80 then '優秀'
when 數學>=60 then '及格'
else '不及格') as 數學,
(case when 英語>=80 then '優秀'
when 英語>=60 then '及格'
else '不及格') as 英語,
from table
spa


CASE 多是 SQL 中被誤用最多的關鍵字之一。雖然你可能之前用過這個關鍵字來建立字段,可是它還具備更多用法。例如,你能夠在 WHERE 子句中使用 CASE。orm

首先讓咱們看一下 CASE 的語法。在通常的 SELECT 中,其語法以下:排序

SELECT =
            CASE
            WHEN THEN
            WHEN THEN
            ELSE
            END
數學


在上面的代碼中須要用具體的參數代替尖括號中的內容。下面是一個簡單的例子:it

USE pubs
            GO
            SELECT
            Title,
            'Price Range' =
            CASE
            WHEN price IS NULL THEN 'Unpriced'
            WHEN price < 10 THEN 'Bargain'
            WHEN price BETWEEN 10 and 20 THEN 'Average'
            ELSE 'Gift to impress relatives'
            END
            FROM titles
            ORDER BY price
            GO
io


這是 CASE 的典型用法,可是使用 CASE 其實能夠作更多的事情。比方說下面的 GROUP BY 子句中的 CASE:table

SELECT 'Number of Titles', Count(*)
            FROM titles
            GROUP BY
            CASE
            WHEN price IS NULL THEN 'Unpriced'
            WHEN price < 10 THEN 'Bargain'
            WHEN price BETWEEN 10 and 20 THEN 'Average'
            ELSE 'Gift to impress relatives'
            END
            GO
select


你甚至還能夠組合這些選項,添加一個 ORDER BY 子句,以下所示:

USE pubs
            GO
            SELECT
            CASE
            WHEN price IS NULL THEN 'Unpriced'
            WHEN price < 10 THEN 'Bargain'
            WHEN price BETWEEN 10 and 20 THEN 'Average'
            ELSE 'Gift to impress relatives'
            END AS Range,
            Title
            FROM titles
            GROUP BY
            CASE
            WHEN price IS NULL THEN 'Unpriced'
            WHEN price < 10 THEN 'Bargain'
            WHEN price BETWEEN 10 and 20 THEN 'Average'
            ELSE 'Gift to impress relatives'
            END,
            Title
            ORDER BY
            CASE
            WHEN price IS NULL THEN 'Unpriced'
            WHEN price < 10 THEN 'Bargain'
            WHEN price BETWEEN 10 and 20 THEN 'Average'
            ELSE 'Gift to impress relatives'
            END,
            Title
            GO


注意,爲了在 GROUP BY 塊中使用 CASE,查詢語句須要在 GROUP BY 塊中重複 SELECT 塊中的 CASE 塊。

除了選擇自定義字段以外,在不少狀況下 CASE 都很是有用。再深刻一步,你還能夠獲得你之前認爲不可能獲得的分組排序結果集。

 

 

 

      SELECT ROW_NUMBER() OVER ( PARTITION BY 1 ORDER BY a.CreateDate) AS row_n,
      a.OrderId,u.Name as UserName,a.UserId,v.VerifyName,p.ProductName,d.DepName,o.Name as CreteUserName,
'OptName' =
            CASE
            WHEN a.VerifyStatus = 1002 THEN '--'
            ELSE  o1.Name
            END ,
  a.Purpose,a.Term,a.ApplyAmount,a.MonthAmount,a.NetAmount,a.YearRate,a.ServerFee,u.IDCard,w.CompanyName,
      replace(CONVERT(varchar, a.CreateDate, 111 ),'/','-')as CreateDates,a.VerifyStatus,u.Phone
      FROM  T_LoanProductOrder as a
      inner join T_UserInfo as u on a.UserId=u.UserId
      inner join T_VerfyStatus as v on a.VerifyStatus=v.VerifyId
      inner join T_Product as p on a.ProductTypeId=p.ProductId
      inner join T_OperaterInfo as o on o.OptId=a.CreateUserId
 inner join T_OperaterInfo as o1 on o1.OptId = a.FirstVerifyOptId 
      inner join T_DepartmentInfo as d on o.DepId=d.DepId
      inner join T_UserWorkInfo as w on u.UserId=w.UserId
      where 1=1 and a.VerifyStatus = 1002 or a.VerifyStatus = 3023 
相關文章
相關標籤/搜索