在select声明的情况
我有一个SQL语句,有一个来自SELECT
的CASE
,我只是不能正确的。 你们可以给我看一个例子, 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
对于这些types的语法和用法问题,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领域。
我认为这些可能对你有帮助。
使用带简单CASE
expression式的SELECT
语句
在一个SELECT
语句中,一个简单的CASE
expression式只允许一个相等性检查; 没有其他的比较。 以下示例使用CASE
expression式来更改产品线类别的显示,以使其更易于理解。
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
使用带有searchCASE
expression式的SELECT
语句
在SELECT
语句中,search的CASE
expression式允许根据比较值在结果集中replace值。 以下示例根据产品的价格范围将列表价格显示为文本注释。
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
expression式来根据给定的列值确定行的sorting顺序。 在第一个示例中,将评估HumanResources.Employee表的SalariedFlag列中的值。 将SalariedFlag设置为1的员工按照BusinessEntityID的降序顺序返回。 将SalariedFlag设置为0的员工按照BusinessEntityID的升序顺序返回。 在第二个示例中,当CountryRegionName等于“United States”列时,结果集按列TerritoryNamesorting,对于所有其他行,则按CountryRegionNamesorting。
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
以下示例使用UPDATE
语句中的CASE
expression式来确定为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
expression式来限制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;
你也可以使用:
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