首页 > 代码库 > CASE 表达式

CASE 表达式

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]