CASE表达式是一个标量表达式,它基于条件逻辑返回一个值。注意,CASE是一个表达式,而不是一条语句;也就是说,不能用它来控制活动的流程,也不能根据条件逻辑来做某些处理,相反,它只是根据条件逻辑来返回摸个值。因为CASE是一个标量表达式,所以它可以支持任何标量表达式(如SELECT,WHERE,HAVING以及ORDER BY)、CHECK约束 等等。
CASE表达式有两种格式:简单表达式和搜索表达式
——简单表达式
CASE简单表达式是将一个值(或者标量表达式)与一组可能的值进行比较,并返回第一个匹配的结果。如果列表中没有值等于测试值,CASE表达式就返回其ELSE子句中列出的值;如果CASE中没有ELSE子句,则默认将其视为ELSE NULL。
例如:以下对Production.Products表的查询就在SELECT子句中使用了CASE表达式,以生成用于描述categoryid列值的信息
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 categroyname
FROM Production.Products
该查询生成以下结果集
前面这个查询使用CASE表达式的一个简单例子,除非categoryid的种类非常少,而且是静态的,否则更好的设计选择可能应该在另外一个单独的表中来维护categoryid,当需要获取categoryid描述时,把那个表和Products进行连接操作
作为CASE简单表达式的另外一种演示,对Sales.OrderValues视图的查询先根据val逻辑顺序分成三个组,再把组的编号翻译成组的描述信息
SELECT orderid,custid,val,
CASE Ntitle(3) OVER(ORDEY BY val)
WHEN 1 THEN 'Low'
WHEN 2 THEN 'Medium'
WHEN 3 THEN 'Hign'
ELSE 'Unknown'
END AS titledesc
FROM Sales.OrderValues
ORDER BY val
该查询会生成以下输出:
CASE简单表达式只有一个测试值,它紧跟在CASE 关键字后面,与WHEN中的一组可能值进行比较。
——CASE搜索表达式
CASE搜索表达式要更加灵活一些,它允许在WHEN子句中指定谓词或逻辑表达式,而不仅限于相等性的比较。CASE搜索表达式返回结果为TRUE的第一个WHEN逻辑表达式所关联的THEN子句中指定的值;如果没有任何WHEN表达式结果为TRUE,CASE表达式就返回ELSE子句中出现的值。
例如,以下查询根据val是否小于1000.00,在1000.00与3000.00之间,大于3000.00而生成相应的描述
SELECT orderid,custid,val,
CASE
WHEN val<1000.00 THEN 'Less then 1000'
WHEN val BETWEEN 1000.00 AND 3000.00 THEN 'BETWEEN 1000 AND 3000'
WHEN val>3000.00 THEN 'More Than 3000'
ELSE 'Unknown'
END AS valuescategory
FROM Sales.OrderValues
ORDER BY val
该查询生成以下输出
可以看到每个CASE简单表达式都可以转换成CASE搜索表达式,但并非所有的情况都有必要使用CASE搜索表达式