2013-01-07 84 views
99

我有一條SQL語句,其CASESELECT我只是不能正確的。你們能向我展示一個CASE的例子,案例是條件,結果來自案例。例如:在Select語句中的案例

 Select xxx, yyy 
    case : desc case when bbb then 'blackberry'; 
    when sss then 'samsung'; 
    end 
    from (select ???? ..... 

,其中結果表明

name       age  handphone 
xxx1       yyy1  blackberry 
xxx2       yyy2  blackberry 
+0

[我的答案](http://stackoverflow.com/a/38874485/1045444)解釋兩種情況類型1.簡單CASE表達式2.搜索CASE表達式。並且在SELECT,UPDATE,WITH ORDER BY和HAVING查詢中都使用這兩種類型的用例。 –

回答

148

的MSDN是關於語法和用法,這些類型的問題一個很好的參考。這來自Transact SQL Reference - CASE頁面。

http://msdn.microsoft.com/en-us/library/ms181765.aspx

USE AdventureWorks2012; 
GO 
SELECT ProductNumber, Name, "Price Range" = 
    CASE 
    WHEN ListPrice = 0 THEN 'Mfg item - not for resale' 
    WHEN ListPrice < 50 THEN 'Under $50' 
    WHEN ListPrice >= 50 and ListPrice < 250 THEN 'Under $250' 
    WHEN ListPrice >= 250 and ListPrice < 1000 THEN 'Under $1000' 
    ELSE 'Over $1000' 
    END 
FROM Production.Product 
ORDER BY ProductNumber ; 
GO 

你可能想看看如果你使用SQL Server的另一個好發部位爲SQL Server Central。這有大量的資源可用於你想學習的任何SQL Server領域。

6

你也可以使用:

SELECT CASE 
     WHEN upper(t.name) like 'P%' THEN 
      'productive' 
     WHEN upper(t.name) like 'T%' THEN 
      'test' 
     WHEN upper(t.name) like 'D%' THEN 
      'development' 
     ELSE 
      'unknown' 
     END as type 
FROM table t 
51

我覺得這可能是對你有幫助。

使用SELECT語句簡單CASE表達

在一個SELECT陳述,簡單表達CASE只允許相等性檢查;沒有其他比較。以下示例使用CASE表達式來更改產品線類別的顯示,以使其更易於理解。

USE AdventureWorks2012; 
GO 
SELECT ProductNumber, Category = 
     CASE ProductLine 
     WHEN 'R' THEN 'Road' 
     WHEN 'M' THEN 'Mountain' 
     WHEN 'T' THEN 'Touring' 
     WHEN 'S' THEN 'Other sale items' 
     ELSE 'Not for sale' 
     END, 
    Name 
FROM Production.Product 
ORDER BY ProductNumber; 
GO 

使用SELECT語句搜索的CASE表達

在一個SELECT聲明,所搜索的CASE表達允許以基於比較值的結果集被替換的值。以下示例根據產品的價格範圍將列表價格顯示爲文本評論。

USE AdventureWorks2012; 
GO 
SELECT ProductNumber, Name, "Price Range" = 
     CASE 
     WHEN ListPrice = 0 THEN 'Mfg item - not for resale' 
     WHEN ListPrice < 50 THEN 'Under $50' 
     WHEN ListPrice >= 50 and ListPrice < 250 THEN 'Under $250' 
     WHEN ListPrice >= 250 and ListPrice < 1000 THEN 'Under $1000' 
     ELSE 'Over $1000' 
     END 
FROM Production.Product 
ORDER BY ProductNumber ; 
GO 

ORDER BY子句

以下實施例使用CASE使用CASE表達在ORDER BY子句確定基於給定的列值的行的排列順序。在第一個示例中,評估HumanResources.Employee表的SalariedFlag列中的值。具有SalariedFlag設置爲1的員工將按照BusinessEntityID的降序順序返回。 SalariedFlag設置爲0的員工按照BusinessEntityID的升序順序返回。在第二個示例中,當CountryRegionName列等於'United States'時,結果集按列TerritoryName排序,對於所有其他行,則按CountryRegionName排序結果集。

SELECT BusinessEntityID, SalariedFlag 
FROM HumanResources.Employee 
ORDER BY CASE SalariedFlag WHEN 1 THEN BusinessEntityID END DESC 
     ,CASE WHEN SalariedFlag = 0 THEN BusinessEntityID END; 
GO 


SELECT BusinessEntityID, LastName, TerritoryName, CountryRegionName 
FROM Sales.vSalesPerson 
WHERE TerritoryName IS NOT NULL 
ORDER BY CASE CountryRegionName WHEN 'United States' THEN TerritoryName 
     ELSE CountryRegionName END; 

UPDATE語句

下面的示例使用在UPDATE語句CASE表達式來確定,它被設置爲列VacationHours員工與SalariedFlag設置爲0。當使用值CASE Vacationhours減去10小時的結果爲負值,VacationHours增加40小時;否則,VacationHours會增加20個小時。 OUTPUT子句用於顯示度假前後的值。

USE AdventureWorks2012; 
GO 
UPDATE HumanResources.Employee 
SET VacationHours = 
    (CASE 
     WHEN ((VacationHours - 10.00) < 0) THEN VacationHours + 40 
     ELSE (VacationHours + 20.00) 
     END 
    ) 
OUTPUT Deleted.BusinessEntityID, Deleted.VacationHours AS BeforeValue, 
     Inserted.VacationHours AS AfterValue 
WHERE SalariedFlag = 0; 

HAVING子句

下面的示例使用的CASE表達在HAVING子句限制由SELECT語句返回的行使用CASE。該聲明返回HumanResources.Employee表中每個職位的最大小時費率。 HAVING條款將標題限制爲最高支付率超過40美元的男性或最高支付率超過42美元的女性持有的標題。

USE AdventureWorks2012; 
GO 
SELECT JobTitle, MAX(ph1.Rate)AS MaximumRate 
FROM HumanResources.Employee AS e 
JOIN HumanResources.EmployeePayHistory AS ph1 ON e.BusinessEntityID = ph1.BusinessEntityID 
GROUP BY JobTitle 
HAVING (MAX(CASE WHEN Gender = 'M' 
     THEN ph1.Rate 
     ELSE NULL END) > 40.00 
    OR MAX(CASE WHEN Gender = 'F' 
     THEN ph1.Rate 
     ELSE NULL END) > 42.00) 
ORDER BY MaximumRate DESC; 

對於這些例子的更多細節描述訪問source

有關詳細信息,請訪問herehere