原文地址:http://www.cnblogs.com/rwxwsblog/p/4512061.html

在日常开发中由于业务逻辑较为复杂,常常需要用到UPDATE和CASE...WHEN...THEN...ELSE...END一起做一些复杂的更新。有时候因为对这几个字句理解得不透彻会带来很大的困扰。因此对UPDATE和CASE WHEN结构的特性做进一步的测试。

  CASE WHEN的两种写法:
    Type 1: CASE value WHEN [compare-value] THEN result [WHEN [compare-value] THEN result ...] [ELSE result] END
    Type 2: CASE WHEN [condition] THEN result [WHEN [condition] THEN result ...] [ELSE result] END

  结论:
    在第一个方案的返回结果中,value=compare-value.而第二个方案的返回结果是第一种情况的真实结果.
    如果没有匹配的结果值,则返回结果为ELSE后的结果,如果没有ELSE 部分,则返回值为NULL,如果字段为NOT NULL则会根据不同数据类型返回不同的值(字符串类型时返回空字符串,数值类型时返回0,其它类型未做测试).

注意:如果CASE...WHEN...THEN...END没有WHERE字句的话会将相应表的记录遍历一遍。

创建测试表

CREATE TABLE `goods` (
`id` bigint(20) NOT NULL AUTO_INCREMENT,
`name` varchar(255) NOT NULL DEFAULT '',
`type` varchar(255) NOT NULL DEFAULT '',
PRIMARY KEY (`id`)
) ENGINE=MyISAM AUTO_INCREMENT=1 DEFAULT CHARSET=latin1

测试数据

1
2
3
4
5
6
7
8
id name type
1    1    1
2    2    1
3    3    2
4    4    2
5    5    3
6    6    3
7    7    4
  • 没有WHERE字句时会遍历所有记录
UPDATE `goods` SET `type` = (
CASE `name` WHEN 1 THEN 999
WHEN 2 THEN 1000
WHEN 3 THEN 1024
END)

  执行结果

1
2
3
4
(7 row(s) affected, 4 warning(s))
Execution Time : 00:00:00:000
Transfer Time  : 00:00:00:047
Total Time     : 00:00:00:047

  type为字符串时返回空字符串,执行后的数据

1
2
3
4
5
6
7
1   1   999
2   2   1000
3   3   1024
4   4  
5   5  
6   6  
7   7  

  type为整形时返回0,执行后的数据

1
2
3
4
5
6
7
1   1   999
2   2   1000
3   3   1024
4   4   0
5   5   0
6   6   0
7   7   0
  • 添加where字句
UPDATE `goods` SET `type` = (
CASE `name` WHEN 1 THEN 999
WHEN 2 THEN 1000
WHEN 3 THEN 1024
END)
WHERE ID in(1, 2, 3);

  执行结果

1
2
3
4
(3 row(s) affected)
Execution Time : 00:00:00:000
Transfer Time  : 00:00:00:016
Total Time     : 00:00:00:016

  执行后的数据

1
2
3
4
5
6
7
1   1   999
2   2   1000
3   3   1024
4   4   4
5   5   5
6   6   6
7   7   7

  由此可见,做UPDATE时WHERE字句是多么的重要。做UPDATE更新时请时刻记住WHERE这条尾巴。

[转]mysql update case when和where之间的注意事项的更多相关文章

  1. mysql update case when和where之间的注意事项

    在日常开发中由于业务逻辑较为复杂,常常需要用到UPDATE和CASE...WHEN...THEN...ELSE...END一起做一些复杂的更新.有时候因为对这几个字句理解得不透彻会带来很大的困扰.因此 ...

  2. Mysql update case

    UPDATE table SET total = CASE WHEN total = '1' THEN total- 1 ELSE total = '2' END WHERE id = 17

  3. Mysql 批量更新update的表与表之间操作

    Mysql 批量更新update的表与表之间操作 一.方法一 使用User2表数据更新User表: update User as a ,User2 as b set a.role_id=b.set_v ...

  4. 记录一下MySql update会锁定哪些范围的数据

    目录 1.背景 2.前置知识 2.1 数据库的隔离级别 2.2 数据库版本 2.3 数据库的存储引擎 2.4 锁是加在记录上还是索引上 2.5 update...where加锁的基本单位是 2.6 行 ...

  5. MySQL存储过程 CASE语句

    MySQL存储过程  CASE语句 除了IF语句,MySQL提供了一个替代的条件语句CASE. MySQL CASE语句使代码更加可读和高效. CASE语句有两种形式:简单的搜索CASE语句. 简单C ...

  6. [转]MySQL update join语句

    原文地址:https://www.jianshu.com/p/f99665266bb1 在本教程中,您将学习如何使用MySQL UPDATE JOIN语句来执行跨表更新.我们将逐步介绍如何使用INNE ...

  7. oracle 批量更新之update case when then

      oracle 批量更新之update case when then CreationTime--2018年8月7日15点51分 Author:Marydon 1.情景描述 根据表中同一字段不同情况 ...

  8. MySQL、MongoDB、Redis 数据库之间的区别与使用(本章迭代更新)

    MySQL.MongoDB.Redis 数据库之间的区别与使用 MySQL.MongoDB.Redis 数据库之间的区别与使用(本章迭代更新) update:2019年2月20日 15:21:19(本 ...

  9. mysql update获取主键

    mysql update获取主键<pre>SET @update_id := 0;UPDATE mobantestinfo1 SET info2 = 'value', id = (SELE ...

随机推荐

  1. 编码 GBK 的不可映射字符

    一般做项目公司都会统一要求文件编码类型,很多为了实现应用国际化和本地化和更高的性能,而选用UTF-8而非GBK. 但在开发过程中我们都用的是IDE,只要更改了配置就不用操心了,但有时我们也会用命令行来 ...

  2. Android面试之HashMap的实现原理

    1.HashMap与HashTable的区别 HashMap允许key和value为null: HashMap是非同步的,线程不安全,也可以通过Collections.synchronizedMap( ...

  3. spring MVC中传递的参数对象中包含list的情况

    测试需要的jar包:spring 3.2.jar +  jackson-all-1.8.5.jar. 写代码时碰到个需要将对象里的子明细一起传递到controller里去,当时就想直接将参数一起传递过 ...

  4. Ios开发中UILocalNotification实现本地通知实现提醒功能

    这两天在做一个日程提醒功能,用到了本地通知的功能,记录相关知识如下: 1.本地通知的定义和使用: 本地通知是UILocalNotification的实例,主要有三类属性: scheduled time ...

  5. [转]Greenplum 资源隔离的原理与源码分析

    摘要: 背景 Greenplum是一个MPP的数据仓库系统,最大的优点是水平扩展,并且一个QUERY就能将硬件资源的能力发挥到极致. 但这也是被一些用户诟病的一点,因为一个的QUERY就可能占光所有的 ...

  6. axios 简单常用笔记

    简单认知: 1.config.data是POST参数,config.params是GET参数 axios(url, [config]) + qs + application/x-www-form-ur ...

  7. Android Activity全面解析

    Android Activity全面解析 首先,就从Android四大组件Activity开始. 1.Activity生命周期方法完全解析   activity_lifecycle.png 1).on ...

  8. OpenXml SDK 2.0 创建Word文档 添加页、段落、页眉和页脚

    using (WordprocessingDocument objWordDocument = WordprocessingDocument.Create(@"C:\********.doc ...

  9. Atitit 图像处理 halcon类库的使用  范例边缘检测 attilax总结

    Atitit 图像处理 halcon类库的使用  范例边缘检测 attilax总结 1.1. 安装halcon11 ..体积大概1g压缩模式1 1.2. Halcon的科技树1 1.3. 启动 &qu ...

  10. C++ Primer笔记 容器和算法(2)

    erase 删除后  返回的是删除元素的后一个迭代器位置 int main() { //怎样正确的删除全部元素 循环 int a[]={1,2,3,4,5,6,7,8,9}; vector<in ...