case when的判断顺序_sql中加入IF ELSE(CASE语句的使用)判断语句

标准的SQL语言是不支持if 这些判断语句的,如果要加入条件,一般得用到where子句。

比如,要查找customer表中的人名为‘张三’的,写成sql语句为

select * from customer where name='张三'。

在表达式中可以使用CASE语句达到IF()的效果。

例如:

SELECT MAX(CASE WHEN Field1>=Field2 THEN Field1 ELSE Field2) FROM TableName

IF 表达式

IF( expr1 , expr2 , expr3 )

expr1 的值为 TRUE,则返回值为 expr2

expr2 的值为FALSE,则返回值为 expr3

如下:

SELECT IF(TRUE,1+1,1+2);

-> 2

SELECT IF(FALSE,1+1,1+2);

-> 3

SELECT IF(STRCMP("111","222"),"不相等","相等");

-> 不相等

那么这个 IF 有啥用处呢?举个例子:

查找出售价为 50 的书,如果是 java 书的话,就要标注为 已售完

那么对应的SQL语句该怎样去写呢?

select *,if(book_name='java','已卖完','有货') as product_status from book where price =50

IFNULL 表达式

IFNULL( expr1 , expr2 )

在 expr1 的值不为 NULL的情况下都返回 expr1,否则返回 expr2,如下:

SELECT IFNULL(NULL,"11");

-> 11

SELECT IFNULL("00","11");

-> 00

大家对IF ELSE语句可能都很熟悉,它是用来对过程进行控制的。在SQL的世界中CASE语句语句有类似的效果。下面简单的介绍CASE语句的用法。考虑下面的情况,假设有个user表,定义如下:

CREATE TABLE USER

(

NAME VARCHAR(20) NOT NULL,---姓名

SEX INTEGER,---性别(1、男   2、女)

BIRTHDAY DATE---生日

);

CREATE TABLE USER

(

NAME VARCHAR(20) NOT NULL,---姓名

SEX INTEGER,---性别(1、男 2、女)

BIRTHDAY DATE---生日

);

CASE使用场合1:把user表导出生成一个文件,要求性别为男或女,而不是1和2,怎么办?我们可以用如下的语句处理:

SELECT

NAME,

CASE SEX

WHEN 1 THEN '男'

ELSE '女'

END AS SEX,

BIRTHDAY

FROM USER;

SELECT

NAME,

CASE SEX

WHEN 1 THEN '男'

ELSE '女'

END AS SEX,

BIRTHDAY

FROM USER;

CASE使用场合2:假设user目前没有值,然后你往user导入了一批数据,但是很不幸,错把男设置成为2,而把女设置成为1,现在要求你变换过来,怎么办?

方法1:使用三条语句,先把2更新成3,接着把1更新成2,最后把3更新成1,很麻烦,不是吗?

UPDATE USER SET SEX=3 WHERE SEX=2;

UPDATE USER SET SEX=1 WHERE SEX=3;

UPDATE USER SET SEX=2 WHERE SEX=1;

UPDATE USER SET SEX=3 WHERE SEX=2;

UPDATE USER SET SEX=1 WHERE SEX=3;

UPDATE USER SET SEX=2 WHERE SEX=1;

方法2:使用CASE语句

UPDATE USER SET SEX=

(

CASE SEX

WHEN 1 THEN 2

WHEN 2 THEN 1

ELSE SEX

END

);

UPDATE USER SET SEX=

(

CASE SEX

WHEN 1 THEN 2

WHEN 2 THEN 1

ELSE SEX

END

);

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

CASE使用场合3:假设让你把张三的生日更新成1949-10-1,李四的生日更新成1997-7-1等,类似这样的更新由很多。该怎么办呢?非常简单,大多数人会这么做。

update USER set BIRTHDAY='1949-10-1' where NAME='张三';

update USER set BIRTHDAY='1997-7-1' where NAME='李四';

update USER set BIRTHDAY='1949-10-1' where NAME='张三';

update USER set BIRTHDAY='1997-7-1' where NAME='李四';

当USER表的数据量非常大,而NAME字段上又没有索引时,每条语句都要进行全表扫描,如果这样的语句有很多,效率会非常差,这时候我们可以用CASE语句,如下:

UPDATE USER SET BIRTHDAY=

(

CASE NAME

WHEN '张三' THEN '1949-10-1'

WHEN '李四' THEN '1997-7-1'

ELSE BIRTHDAY

END

)

where NAME in ('张三','李四');

UPDATE USER SET BIRTHDAY=

(

CASE NAME

WHEN '张三' THEN '1949-10-1'

WHEN '李四' THEN '1997-7-1'

ELSE BIRTHDAY

END

)

where NAME in ('张三','李四');

以上语句只进行一次全表扫描,效率非常高。

---致谢:higny发现了本文的一个错误,在此表示严重感谢

---更多参见:DB2 SQL 精要

----声明:转载请注明出处。

----last update at 2010.5.7

----write by wave at 2009.9.23

----end

一般项目开发中,我会直接使用sql在数据库中先查询出数据,然后再对数据进行显示处理。

这样做,不仅麻烦,而且效率不高。

其实,可以直接在sql语句中操作,将从数据库中查询出来的信息不要直接放入结果集中,而是将这些信息转换成页面需要显示的数据后再存入结果集中。

sql语句:

select

case

when oi.order_type_id='SALE' then '销售'

when oi.order_type_id='PURCHASE' then '采购'

end as 订单类型

from order_info as oi;

然后在结果集中取出字段名为‘订单类型’的数据即可。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值