转载出处:https://blog.csdn.net/shangboerds/article/details/41989283
经常有这类问题,比如性别的男女,一般在数据库中不存男女,而存数字0或1,1或2,查询出来展示的时候做转换。
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');
CASE使用案例 1 把 USER_INFO 表导出生成一个文件,要求性别为男或女,而不是1和2,怎么办?
SELECT
NAME,
CASE GENDER
WHEN 1 THEN '男'
ELSE '女'
END AS GENDER,
BIRTHDAY
FROM USER_INFO;
CASE使用案例 2 假设 USER_INFO 目前没有值,然后你往 USER_INFO 导入了一批数据,但是很不幸,错把男设置成为2,而把女设置成为1,现在要求你变换过来,怎么办?
方法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;
方法2:使用case语句
UPDATE USER_INFO SET GENDER=
(
CASE GENDER
WHEN 1 THEN 2
WHEN 2 THEN 1
ELSE GENDER
END
);
两者相比比,处理多的数据时是case语句效率更快,不容易出问题
CASE使用案例 3 假设让你把张三的生日更新成1949-10-1,李四的生日更新成1997-7-1等,类似这样的更新有很多。该怎么办呢?
大多人会用普通的update语句,为什么不试试用case语句呢,
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语句有两种形式
1、SELECT
-- 简单 CASE 语句(Simple CASE)
CASE GENDER
WHEN 1 THEN '男'
ELSE '女'
END AS GENDER
FROM USER_INFO;
2、SELECT
-- 查询 CASE 语句(Searched CASE)
CASE
WHEN GENDER = 1 THEN '男'
ELSE '女'
END AS GENDER
FROM USER_INFO;
DECODE 函数
此外, Oracle 还提供了一个函数来达到和 CASE 语句相同的效果。
SELECT DECODE(GENDER, 1, '男', 2, '女', '未知') FROM USER_INFO;