Oracle SQL中的 IF ELSE

本文介绍了在 SQL 中如何使用 CASE 语句进行条件判断,以替代熟悉的 IF ELSE 逻辑。通过 CASE 使用案例,展示了如何在 USER_INFO 表中处理性别字段,以及如何方便地进行数据修正和批量更新。同时提到了 Oracle 的 DECODE 函数,作为 CASE 语句的一种替代选择。

-- 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');


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:使用三条语句,先把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;

方法2:使用CASE语句

UPDATE USER_INFO SET GENDER=
(
  CASE GENDER
    WHEN 1 THEN 2
    WHEN 2 THEN 1
    ELSE GENDER
  END
);

细心的朋友可能已经发现了,上面的方法1 的三条语句的执行顺序有问题,没错,是我故意那些写的,仅仅是把1变成2,把2变成1就那么麻烦,而且很容易出错,想象一下,如果有很多这样的值需要变换,那是一种什么样的情况。还好,我们有CASE语句,有好多这样的值需要变换,CASE语句也不会存在问题。

CASE使用案例 3

假设让你把张三的生日更新成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 = '李四';

当 USER_INFO 表的数据量非常大,而 NAME 字段上又没有索引时,每条语句都要进行全表扫描,如果这样的语句有很多,效率会非常差,这时候我们可以用 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 语句的形式

事实上,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;

DECODE 函数

此外, 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


SQL中,并没有直接的`if-else`语句结构,这与一些编程语言不同。但是,SQL提供了一些方法来实现类似`if-else`逻辑的决策过程,尤其是在数据查询和数据操作语句中。以下是一些常见的实现方式: 1. 使用`CASE`语句:`CASE`语句可以在`SELECT`查询中实现条件逻辑,它类似于编程语言中的`if-then-else`结构。`CASE`语句有两种形式:简单形式和搜索形式。 - 简单`CASE`语句:比较表达式的值与一系列值,根据匹配结果返回不同的结果。 ```sql SELECT CASE column_name WHEN value1 THEN 'Result1' WHEN value2 THEN 'Result2' ... ELSE 'DefaultResult' END AS new_column_name FROM table_name; ``` - 搜索`CASE`语句:使用`WHEN`子句进行布尔表达式的判断,类似于`if-then-else if-then-else`结构。 ```sql SELECT CASE WHEN condition1 THEN 'Result1' WHEN condition2 THEN 'Result2' ... ELSE 'DefaultResult' END AS new_column_name FROM table_name; ``` 2. 使用`DECODE`函数(特定于Oracle):`DECODE`函数提供了类似`CASE`语句的功能,用于在Oracle数据库中进行条件判断。 ```sql SELECT DECODE(column_name, value1, 'Result1', value2, 'Result2', 'DefaultResult') AS new_column_name FROM table_name; ``` 3. 使用`IIF`函数(在某些数据库系统中可用,如SQL Server 2012及更高版本、PostgreSQL等):`IIF`函数提供了一个条件表达式,如果条件为真,则返回一个值,否则返回另一个值。 ```sql SELECT IIF(condition, 'ResultIfTrue', 'ResultIfFalse') AS new_column_name FROM table_name; ``` 4. 使用逻辑运算符:通过`AND`、`OR`、`NOT`等逻辑运算符来构建复杂的条件表达式,虽然这不是`if-else`,但在很多情况下可以用来实现类似的效果。 ```sql SELECT * FROM table_name WHERE condition1 AND (condition2 OR condition3); ```
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值