在Select语句中使用Case

161

我有一条SQL语句,其中有一个CASESELECT中查询,但我就是无法编写正确。你们能否给我展示一个条件为cases而结果来自cases的例子?例如:

     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

我的回答 解释了两种情况类型:1. 简单 CASE 表达式 2. 搜索 CASE 表达式。以及这两种类型在 SELECT、UPDATE、带有 ORDER BY 和带有 HAVING 的查询中的用法。 - Somnath Muluk
3个回答

218

MSDN是关于语法和用法方面的问题的良好参考。这是来自Transact SQL参考 - 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领域。


1
由于每个case条件按指定顺序进行检查,并且第一个true条件获胜,因此无需执行重复检查,例如WHEN ListPrice >= 50 and ListPrice < 250 THEN可以写成WHEN ListPrice < 250 THEN,因为前一行已经确定了ListPrice不是<50。(就像您处理<50而不再次检查0一样。)附注:负的清单价格将掉入“低于50美元”的桶中。 - HABO

102
我认为这些对你可能有帮助。
使用简单的CASE表达式和SELECT语句
在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

使用带有搜索的 CASE表达式的SELECT语句

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

以下示例在 ORDER BY 子句中使用 CASE 表达式来确定基于给定列值的行的排序顺序。在第一个示例中,评估了 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 语句中使用 CASE

以下示例使用 CASE 表达式在 UPDATE 语句中确定为 SalariedFlag 设置为 0 的员工设置的列 VacationHours 的值。当从 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子句中使用CASE表达式,限制SELECT语句返回的行。该语句返回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;

要了解这些示例的详细说明,请访问此处

另外,访问此处此处,以获取一些具有详细说明的示例。


17

您也可以使用:

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接