150

我有一个带有CASEfrom的 SQL 语句,但SELECT我就是做错了。你们能给我举个例子,CASE说明案例是条件,结果来自案例。例如:

     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
4

3 回答 3

206

对于此类有关语法和用法的问题,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 的任何领域提供了大量资源。

于 2013-01-07T03:21:28.473 回答
90

我认为这些可能对您有所帮助。

使用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

CASEORDER BY子句中使用

以下示例使用子句中的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;

CASEUPDATE语句中使用

以下示例使用语句CASE中的表达式UPDATE来确定为将 SalriedFlag 设置为 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; 

CASEHAVING子句中使用

以下示例使用子句中的CASE表达式HAVING来限制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;

有关这些示例的更多详细信息,请访问源代码

还可以访问此处此处以获取一些非常详细的示例。

于 2015-11-16T00:53:48.383 回答
15

您还可以使用:

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
于 2015-06-22T11:31:21.863 回答