我有一个来自CASE
的{{1}}的SQL语句,我无法正确使用它。你们能告诉我SELECT
的一个例子,其中案例是条件,结果来自案例。例如:
CASE
结果显示
Select xxx, yyy
case : desc case when bbb then 'blackberry';
when sss then 'samsung';
end
from (select ???? .....
答案 0 :(得分:182)
对于语法和用法这些类型的问题,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的任何区域。
答案 1 :(得分:71)
我认为这些对您有所帮助。
使用带有简单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
以下示例使用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;
在CASE
声明中使用UPDATE
以下示例使用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;
在CASE
子句中使用HAVING
以下示例使用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;
有关这些示例的详细说明,请访问source。
答案 2 :(得分:9)
你也可以使用:
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