选择陈述中的案例


141

我有一个带有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

我的答案解释了两种情况类型1.简单的CASE表达式2.搜索的CASE表达式。以及两种类型在SELECT,UPDATE,ORDER BY,HAVING查询中的大小写用法。
Somnath Muluk

Answers:


195

对于有关语法和用法的这类问题,MSDN是一个很好的参考。这来自《 Transact SQL参考-案例》页面。

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领域,它都有大量可用的资源。


82

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

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

使用CASE一个在ORDER BY条款

以下示例CASEORDER BY子句中使用表达式,以基于给定的列值确定行的排序顺序。在第一个示例中,评估HumanResources.Employee表的SalariedFlag列中的值。将SalariedFlag设置为1的员工按BusinessEntityID的降序返回。将SalariedFlag设置为0的员工按BusinessEntityID的升序顺序返回。在第二个示例中,当列CountryRegionName等于“美国”时,结果集按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声明

下面的示例CASEUPDATE语句中使用该表达式来确定为SalariedFlag设置为0的员工为VacationHours列设置的值。从VacationHours减去10小时得出负值时,VacationHours增加40小时;而从VacationHours中减去10小时则得出负值。否则,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; 

使用CASE一个在HAVING条款

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

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

也可以在此处此处访问一些示例,以获取详细信息。


真的很感谢这样详细的答案。
Aneeq Azam Khan

12

您还可以使用:

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
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.