CASE 表达式是一个标量表达式,它基于条件逻辑来返回一个值。注意,CASE 是一个表达式,而不是一条语句;也就是说,不能用它来控制活动的流程,也不能根据条件逻辑来做某些处理。相反,它只是根据条件逻辑来返回某个值。因为CASE是一个标量表达式,所以它可以支持任何标量表达式(如SELECT、WHERE、HAVING,以及ORDER BY)、CHECK 约束,等等。
CASE 表达式有两种格式:简单表达式和搜索表达式。CASE简单格式将一个值(或一个标量表达式)与一组可能的取值进行比较,并返回第一个匹配的结果。如果列表中没有值等于测试值,CASE 表达式就返回其ELSE 子句(如果存在)中列出的值。如果CASE表达式中没有ELSE 子句,则默认将其视为 ELSE NULL.
例:
-- case 简单格式将一个值(或一个标量表达式)与一组可能的取值进行比较,
-- 并返回第一个匹配的结果。
select productid,productname,categoryid,
case categoryid
when 1 then 'Beverages'
when 2 then 'Condiments'
when 3 then 'Confections'
when 4 then 'Dairy Products'
when 5 then 'Grains/Cereals'
when 6 then 'Meat/Poultry'
when 7 then 'Produce'
when 8 then 'Seafood'
else 'Unknown Category'
end as categoryname
from [Northwind].[dbo].[products]
-- case 另一个演示,对视图进行查询,根据 freight 的逻辑顺序生成 3个组
-- 再把组的编号翻译成组的描述信息(Low,Medium,以及 High);
select orderid,customerid,freight,
case NTILE(3) over( order by freight)
when 1 then 'Low'
when 2 then 'Medium'
when 3 then 'High'
else 'Unknown'
end as titledesc
from [Northwind].[dbo].[Orders Qry]
-- 查询商品的价格是否小于 1000.00,在 1000.00 到3000.00,或者大于3000.00而生
-- 成相应的价格描述
select orderid,customerid,freight,
case
when freight<1000.00 then 'Less then 1000'
when freight between 1000.00 and 3000.00 then 'Between 1000 and 3000'
when freight>3000.00 then 'More than 3000'
else 'Unknown'
end as valuecategory
from [Northwind].[dbo].[Orders Qry]