-- Start
大家对 IF ELSE 语句应该都很熟悉吧,它是用来对过程进行控制的。在 SQL 的世界中 CASE 语句有类似的效果。下面简单的介绍 CASE 语句的用法。考虑下面的情况,假设有个 USER_INFO 表,定义如下:
CREATE TABLE USER_INFO ( NAME VARCHAR2(20) NOT NULL, ---姓名 GENDER NUMBER(1,0), ---性别(1、男 2、女) BIRTHDAY DATE ---生日 ); INSERT INTO USER_INFO VALUES ('张三', 1, DATE '2014-12-27'); INSERT INTO USER_INFO VALUES ('李四', 2, DATE '2014-12-27');
把 USER_INFO 表导出生成一个文件,要求性别为男或女,而不是1和2,怎么办?我们可以用如下的语句处理:
SELECT NAME, CASE GENDER WHEN 1 THEN '男' ELSE '女' END AS GENDER, BIRTHDAY FROM USER_INFO;
假设 USER_INFO 目前没有值,然后你往 USER_INFO 导入了一批数据,但是很不幸,错把男设置成为2,而把女设置成为1,现在要求你变换过来,怎么办?
方法1:使用三条语句,先把2更新成3,接着把1更新成2,最后把3更新成1,是不是很麻烦?
UPDATE USER_INFO SET GENDER=3 WHERE GENDER=2; UPDATE USER_INFO SET GENDER=1 WHERE GENDER=3; UPDATE USER_INFO SET GENDER=2 WHERE GENDER=1;
UPDATE USER_INFO SET GENDER= ( CASE GENDER WHEN 1 THEN 2 WHEN 2 THEN 1 ELSE GENDER END );
假设让你把张三的生日更新成1949-10-1,李四的生日更新成1997-7-1等,类似这样的更新有很多。该怎么办呢?非常简单,大多数人会这么做。
UPDATE USER_INFO SET BIRTHDAY = DATE '1949-10-1' WHERE NAME = '张三'; UPDATE USER_INFO SET BIRTHDAY = DATE '1997-7-1' WHERE NAME = '李四';
UPDATE USER_INFO SET BIRTHDAY = ( CASE NAME WHEN '张三' THEN DATE '1949-10-1' WHEN '李四' THEN DATE '1997-7-1' ELSE BIRTHDAY END ) WHERE NAME in ('张三','李四');
事实上,CASE 语句有两种形式。
SELECT -- 简单 CASE 语句(Simple CASE) CASE GENDER WHEN 1 THEN '男' ELSE '女' END AS GENDER, -- 查询 CASE 语句(Searched CASE) CASE WHEN GENDER = 1 THEN '男' ELSE '女' END AS GENDER FROM USER_INFO;
此外, Oracle 还提供了一个函数来达到和 CASE 语句相同的效果。
SELECT DECODE(GENDER, 1, '男', 2, '女', '未知') FROM USER_INFO;
-- 更多参见:Oracle SQL 精萃
-- 声明:转载请注明出处
-- Last Edited on 2015-01-26
-- Created by ShangBo on 2014-12-17
-- End