CASE表达式是一个标量表达式,它基于条件逻辑来返回一个值。注意,CASE是一个表 达式,而不是一条语句;也就是说,不能用它来控制活动的流程,也不能根据条件逻辑来做某些处理。相反,它只是根据条件逻辑来返回某个值。因为CASE是一个标量表达式,所以它可以支持任何标批表达式(如SELECT、WHERE、HAVING,以及ORDERBY 子句)、CHECK约束,等等。CASE表达式有两种格式:简单表达式和搜索表达式 。
一.简单表达式
CASE简单格式将一个值(或一个标量表达式)与一组可能的取值进行比较, 并返回第一个匹配的结果。如果列表中没有值等于测试值 , CASE表达式就返回其ELSE子句(如果存在)中列出的 值。如果CASE 表达式中没有ELSE子句, 则默认将其视为ELSE NULL。以下代码做个简单示例。
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 Production.Products;
假如查询Sales.OrderValues先根据val的逻辑顺序生成3个组,再把组的编号转换成组的描述信息(Low、Medium,以及High):
SELECT orderid, custid, val, CASE NTILE(3) OVER(ORDER BY val) WHEN l THEN 'Low' WHEN 2 THEN 'Medium' WHEN 3 THEN 'High' ELSE 'Unknown' END AS titledesc FROM Sales.Ordervalues ORDER BY val;
二.搜索表达式
CASE 简单表达式只有一个测试值(或表达式),它紧跟在 CASE 关键字后面,与 WHEN子句中的一组可能值进行比较。CASE 搜索表达式要更灵活些,它可以在 WHEN 子句中指定谓词或逻辑表达式, 而不限于只进行相等性比较。 CASE 搜索表达式返回结果为 TRUE 的第一个 WHEN 逻辑表达式所关联的 THEN 子句中指定的值。 如果没有任何WHEN 表达式结果为 TRUE, CASE 表达式就返回 ELSE 子句中出现的值 (如果没有指 定 ELSE 子句, 则返回 NULL) 。例如, 以下查询根据商品的价格是否小于 1 000.00、在 1 000.00 到 3 000.00 之间、 或者大于 3 000.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 valuecategory FROM Sales.OrderValues;
可以看到, 每个 CASE 简单表达式都可以转换成 CASE 搜索表达式, 但并非所有情况都有必要使用 CASE 搜索表达式。通过这几个例子可以对CASE表达式有大致了解,虽然从这些例子的表面可能看不到 CASE 表达式的独到之处, 但它确实是一种非常强大和实用的语言元素。
好了,本篇文章就介绍到这儿,欢迎大家留言交流;喜欢或有帮助到您的话,点个赞或推荐支持一下!