【02单表查询】——05:CASE表达式

来源:互联网 发布:淘宝客户流失 编辑:程序博客网 时间:2024/06/06 00:33

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 categroynameFROM 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 titledescFROM Sales.OrderValuesORDER 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 valuescategoryFROM Sales.OrderValuesORDER BY val

该查询生成以下输出
这里写图片描述

可以看到每个CASE简单表达式都可以转换成CASE搜索表达式,但并非所有的情况都有必要使用CASE搜索表达式

1 0
原创粉丝点击