精华内容
下载资源
问答
  • MySQL case when 用法

    万次阅读 多人点赞 2018-03-19 15:09:13
    MySQL 的 case when 的语法有两种: CASE [col_name] WHEN [value1] THEN [result1]…ELSE [default] END CASE WHEN [expr] THEN [result1]…ELSE [default] END 这两种语法有什么区别呢? CASE [col_...

    MySQL 的 case when 的语法有两种:

    1. 简单函数
      CASE [col_name] WHEN [value1] THEN [result1]…ELSE [default] END
    2. 搜索函数
      CASE WHEN [expr] THEN [result1]…ELSE [default] END

    这两种语法有什么区别呢?

    简单函数

    CASE [col_name] WHEN [value1] THEN [result1]…ELSE [default] END: 枚举这个字段所有可能的值*

    SELECT
    	NAME '英雄',
    	CASE NAME
    		WHEN '德莱文' THEN
    			'斧子'
    		WHEN '德玛西亚-盖伦' THEN
    			'大宝剑'
    		WHEN '暗夜猎手-VN' THEN
    			'弩'
    		ELSE
    			'无'
    	END '装备'
    FROM
    	user_info;
    

    这里写图片描述

    搜索函数

    CASE WHEN [expr] THEN [result1]…ELSE [default] END:搜索函数可以写判断,并且搜索函数只会返回第一个符合条件的值,其他case被忽略

    # when 表达式中可以使用 and 连接条件
    SELECT
    	NAME '英雄',
    	age '年龄',
    	CASE
    		WHEN age < 18 THEN
    			'少年'
    		WHEN age < 30 THEN
    			'青年'
    		WHEN age >= 30
    		AND age < 50 THEN
    			'中年'
    		ELSE
    			'老年'
    	END '状态'
    FROM
    	user_info;
    

    这里写图片描述

    聚合函数 sum 配合 case when 的简单函数实现多表 left join 的行转列

    注:曾经有个爱学习的路人问我,“那个sum()只是为了好看一点吗?”,left join会以左表为主,连接右表时,得到所有匹配的数据,再group by时只会保留一行数据,因此case when时要借助sum函数,保留其他列的和。如果你还是不明白的话,那就亲手实践一下,只保留left join看一下结果,再group by,看一下结果。例如下面的案例:学生表/课程表/成绩表 ,三个表left join查询每个学生所有科目的成绩,使每个学生及其各科成绩一行展示。

    SELECT
    	st.stu_id '学号',
    	st.stu_name '姓名',
    	sum(
    		CASE co.course_name
    		WHEN '大学语文' THEN
    			sc.scores
    		ELSE
    			0
    		END
    	) '大学语文',
    	sum(
    		CASE co.course_name
    		WHEN '新视野英语' THEN
    			sc.scores
    		ELSE
    			0
    		END
    	) '新视野英语',
    	sum(
    		CASE co.course_name
    		WHEN '离散数学' THEN
    			sc.scores
    		ELSE
    			0
    		END
    	) '离散数学',
    	sum(
    		CASE co.course_name
    		WHEN '概率论与数理统计' THEN
    			sc.scores
    		ELSE
    			0
    		END
    	) '概率论与数理统计',
    	sum(
    		CASE co.course_name
    		WHEN '线性代数' THEN
    			sc.scores
    		ELSE
    			0
    		END
    	) '线性代数',
    	sum(
    		CASE co.course_name
    		WHEN '高等数学' THEN
    			sc.scores
    		ELSE
    			0
    		END
    	) '高等数学'
    FROM
    	edu_student st
    LEFT JOIN edu_score sc ON st.stu_id = sc.stu_id
    LEFT JOIN edu_courses co ON co.course_no = sc.course_no
    GROUP BY
    	st.stu_id
    ORDER BY
    	NULL;
    

    这里写图片描述

    行转列测试数据

    -- 创建表  学生表
    CREATE TABLE `edu_student` (
    	`stu_id` VARCHAR (16) NOT NULL COMMENT '学号',
    	`stu_name` VARCHAR (20) NOT NULL COMMENT '学生姓名',
    	PRIMARY KEY (`stu_id`)
    ) COMMENT = '学生表' ENGINE = INNODB;
    
    -- 课程表 
    CREATE TABLE `edu_courses` (
    	`course_no` VARCHAR (20) NOT NULL COMMENT '课程编号',
    	`course_name` VARCHAR (100) NOT NULL COMMENT '课程名称',
    	PRIMARY KEY (`course_no`)
    ) COMMENT = '课程表' ENGINE = INNODB;
    
    -- 成绩表
    CREATE TABLE `edu_score` (
    	`stu_id` VARCHAR (16) NOT NULL COMMENT '学号',
    	`course_no` VARCHAR (20) NOT NULL COMMENT '课程编号',
    	`scores` FLOAT NULL DEFAULT NULL COMMENT '得分',
    	PRIMARY KEY (`stu_id`, `course_no`)
    ) COMMENT = '成绩表' ENGINE = INNODB;
    
    -- 插入数据
    
    -- 学生表数据
    
    INSERT INTO edu_student (stu_id, stu_name)
    VALUES
    	('1001', '盲僧'),
    	('1002', '赵信'),
    	('1003', '皇子'),
    	('1004', '寒冰'),
    	('1005', '蛮王'),
    	('1006', '狐狸');
    
    -- 课程表数据 
    INSERT INTO edu_courses (course_no, course_name)
    VALUES
    	('C001', '大学语文'),
    	('C002', '新视野英语'),
    	('C003', '离散数学'),
    	(
    		'C004',
    		'概率论与数理统计'
    	),
    	('C005', '线性代数'),
    	('C006', '高等数学');
    
    -- 成绩表数据
    INSERT INTO edu_score (stu_id, course_no, scores)
    VALUES
    	('1001', 'C001', 67),	('1002', 'C001', 68),	('1003', 'C001', 69),	('1004', 'C001', 70),	('1005', 'C001', 71),
    	('1006', 'C001', 72),	('1001', 'C002', 87),	('1002', 'C002', 88),	('1003', 'C002', 89),	('1004', 'C002', 90),
    	('1005', 'C002', 91),	('1006', 'C002', 92),	('1001', 'C003', 83),	('1002', 'C003', 84),	('1003', 'C003', 85),
    	('1004', 'C003', 86),	('1005', 'C003', 87),	('1006', 'C003', 88),	('1001', 'C004', 88),	('1002', 'C004', 89),
    	('1003', 'C004', 90),	('1004', 'C004', 91),	('1005', 'C004', 92),	('1006', 'C004', 93),	('1001', 'C005', 77),
    	('1002', 'C005', 78),	('1003', 'C005', 79);
    

    case when练习

    有如下表结构,统计2019-10-21 00:00:00~2019-12-02 23:59:59时间段内的用户并标记新老用户

    CREATE TABLE `tb_hotel_user`  (
      `customer_id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '旅客id',
      `name` varchar(200) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '姓名',
      `user_id` bigint(10) NULL DEFAULT NULL COMMENT '用户id',
      `check_in_time` datetime(0) NULL DEFAULT NULL COMMENT '入住时间',
      `check_out_time` datetime(0) NULL DEFAULT NULL COMMENT '离店时间',
      PRIMARY KEY (`customer_id`) USING BTREE
    ) ENGINE = InnoDB AUTO_INCREMENT = 6 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci ROW_FORMAT = Compact;
    
    INSERT INTO `tb_hotel_user` VALUES (1, '张三', 1, '2019-12-02 14:18:57', NULL);
    INSERT INTO `tb_hotel_user` VALUES (2, '刘大', 2, '2019-11-08 14:19:07', NULL);
    INSERT INTO `tb_hotel_user` VALUES (3, '关二', 3, '2019-10-17 14:19:21', NULL);
    INSERT INTO `tb_hotel_user` VALUES (4, '关二', 3, '2019-12-02 14:19:44', NULL);
    INSERT INTO `tb_hotel_user` VALUES (5, '赵四', 4, '2019-11-29 14:19:54', NULL);
    
    
    -- 答案
    SELECT
    	a.user_id,
    CASE
    	
    	WHEN ISNULL( b.user_id ) THEN
    	1 ELSE 2 
    	END newUser 
    FROM
    	( SELECT DISTINCT user_id FROM tb_hotel_user WHERE check_in_time >= '2019-10-21 00:00:00' AND check_in_time <= '2019-12-02 23:59:59' ) a
    LEFT JOIN ( SELECT user_id FROM tb_hotel_user WHERE check_in_time <= '2019-12-02 23:59:59' GROUP BY user_id HAVING count( * ) > 1 ) b ON a.user_id = b.user_id
    
    展开全文
  • SQL case when 用法

    千次阅读 2018-07-06 14:19:08
    SQL case when 用法主要是给变量赋值,将连续型变量离散化,主要用SQL中的CASE WHEN实例:create table table_name_new as ----将时间离散化为时间段,并创建一个新table_name_newselect * , case  when call_...

    SQL case when 用法

    主要是给变量赋值,将连续型变量离散化,主要用SQL中的CASE  WHEN

    实例:

    create table table_name_new as   ----将时间离散化为时间段,并创建一个新表table_name_new

    select  * ,
    case 
    when call_period >= '00' and call_period < '08' then 'period_1'
    when call_period >= '08' and call_period < '11' then 'period_2'
    when call_period >= '11' and call_period < '13' then 'period_3'
    when call_period >= '13' and call_period < '17' then 'period_4'
    when call_period >= '17' and call_period < '19' then 'period_5'
    when call_period >= '19' and call_period < '24' then 'period_6'
    else NULL end time_period   

    from table_name    -- 原表

    展开全文
  • select f.FILE_ID,f.FILE_NAME,f.END_DATE, f.CREATE_MAN_ID,f.CREATE_MAN_NAME,f.CREATE_TIME,COUNT(f.FILE_ID) billNum, ... WHEN CAST(SYSDATE - TO_DATE (f.END_DATE, 'yyyy-mm-dd hh:mi:ss') AS numb...
    select f.FILE_ID,f.FILE_NAME,f.END_DATE, f.CREATE_MAN_ID,f.CREATE_MAN_NAME,f.CREATE_TIME,COUNT(f.FILE_ID) billNum,
    
    CASE
    WHEN CAST(SYSDATE - TO_DATE (f.END_DATE, 'yyyy-mm-dd hh:mi:ss') AS number)< 0
    THEN '超过'||substr(CAST(SYSDATE AS TIMESTAMP)-CAST(TO_DATE (f.END_DATE, 'yyyy-mm-dd hh:mi:ss') AS TIMESTAMP),9,2)||'天'
    ||substr(CAST(SYSDATE AS TIMESTAMP)-CAST(TO_DATE (f.END_DATE, 'yyyy-mm-dd hh:mi:ss') AS TIMESTAMP),12,2)||'小时'
    ||substr(CAST(SYSDATE AS TIMESTAMP)-CAST(TO_DATE (f.END_DATE, 'yyyy-mm-dd hh:mi:ss') AS TIMESTAMP),15,2)||'分钟'
    WHEN CAST(SYSDATE - TO_DATE (f.END_DATE, 'yyyy-mm-dd hh:mi:ss') AS number)>0
    tHEN substr(CAST(SYSDATE AS TIMESTAMP)-CAST(TO_DATE (f.END_DATE, 'yyyy-mm-dd hh:mi:ss') AS TIMESTAMP),9,2)
    ||'天'||substr(CAST(SYSDATE AS TIMESTAMP)-CAST(TO_DATE (f.END_DATE, 'yyyy-mm-dd hh:mi:ss') AS TIMESTAMP),12,2)||'小时'
    ||substr(CAST(SYSDATE AS TIMESTAMP)-CAST(TO_DATE (f.END_DATE, 'yyyy-mm-dd hh:mi:ss') AS TIMESTAMP),15,2)||'分钟'
    ELSE '0'
    End remainDate
    from TD_SKL_DEMANDFILE f,TD_SKL_DEMANDSUBMIT s
    where f.FILE_ID=s.FILE_ID
    group by f.FILE_ID,f.FILE_NAME,f.END_DATE, f.CREATE_MAN_ID,f.CREATE_MAN_NAME,f.CREATE_TIME
    展开全文
  • Case_When用法

    2012-03-09 15:42:15
    很好的case_when有关的文档,学习好帮手,多多下载
  • 本文实例讲述了laravel 框架结合关联查询 when()用法。分享给大家供大家参考,具体如下: Laravel 5.6 里面的when用法: $name = $request->get('name'); //活动标题 $start_time = $request->get('start_time'); /...
  • SQL语句 CASE WHEN用法

    万次阅读 2019-06-03 11:53:59
    select Id , ...=60 then '大于60' --注意各结果的数据类型须一致,int和时间等不能转为字符串没出错 when Id <60 then '小于60' else 'ok' end AS result , OwnId from ContentDetectionRecord...
    select Id ,
    		case when Id=1 then '等于1'
    		when Id >=60 then '大于60'  --注意各结果的数据类型须一致,int和时间等不能转为字符串没出错
    		when Id <60 then '小于60'
    		else 'ok' end
    		AS result ,
    		OwnId
    from ContentDetectionRecord
    

    展开全文
  • 最近大量用到了oracle的sql语句中的case when,闲下来就整理一下。 1.根据类别统计 假设现在有一组数据如下 其中,0表示单选题,1表示多选题,现在分别要统计单选题跟多选题的数目,就可以这么做啦 select...
  • SQL语句中case when函数的用法

    千次阅读 2018-08-20 13:57:28
    前一段时间进行一段比较复杂的数据库业务查询...这一种是之前比较常用的一种方式,相当于是大部分编程语言中的switch case的用法,通过字段名,去匹配字段值,适合字段值比较固定的情况下使用,特点是比较简洁易用。 ...
  • SQLServer case when 用法

    2018-03-07 11:48:44
    语法:CASE input_expression WHEN when_expression THEN result_expression [ ...n ] [ ELSE else_result_expression] END case 表达式(计算出一个值和后面的匹配值匹配) when '匹配值1' then '结果1' when '...
  • 主要给大家介绍了关于MySQL排序中使用CASE WHEN的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
  • when '新闻' THEN 'FB2D8753-3E01-465F-9628-0C9ABAAE6427' WHEN '平台' THEN 'FB2D8753-3E01-465F-9628-0C9ABAAE6427' WHEN '网贷' THEN 'FB2D8753-3E01-465F-9628-0C9ABAAE6427' WHEN '众筹' THEN '423B882E-...
  • 记录一下case,when,else 的用法

    千次阅读 2019-08-27 14:57:42
    最近写的模块中遇到要根据开始时间和结束时间来判断当前会议的状态: case when NOW() <a.startDate then 0 when endDate <NOW() then 2 else 1 end stateString 当前时间小于开始时间,即会议未开始...
  • 要求:when从句是定语从句,要求从句的时态和It's的is/was对应。 如:It was ten years ago when I graduated. 我毕业是在十年前。 4. It's + some time + before从句. 翻译:“过了多久...才...”。 要求:before...
  • Date 中 before(when)和after(when)用法

    千次阅读 2016-03-24 16:36:26
    public class Demo7 { public static void main(String[] args) throws ParseException { Date date = new Date(); SimpleDateFormat format = new ...//before(when)的用法和after(when)正好相反
  • 【SQL学习笔记4】case when 和if的用法

    千次阅读 2020-12-25 14:52:51
    1.case用法 case 字段名 when 条件1 then 字段取值1 when 条件2 then 字段取值2 when 条件3 then 字段取值3 else 字段取值4-- 如果上述全部不满足,则执行 2.if用法 if(条件,取值1,取值2)--若条件满足,则取值...
  • 业务逻辑: 想查询警报的一些信息,因为警报消息多的时候,就时间不一样,所以未读的警报只需要取一条和一个最开始的时间和最近的一个时间就行,但是删除 通过 作废的时候,需要修改这些记录 ,所以取出的记录ALARM_ID...
  • 查询各个成绩段的人数 case when 用法

    千次阅读 2018-09-17 11:29:00
    WHEN price IS NULL THEN 'no_score' WHEN price &lt; '60' THEN '不及格' WHEN price BETWEEN '60' AND '80' THEN '良好' WHEN price BETWEEN '81' AND '90' THEN '优秀' ELSE...
  • sql学习之CASE WHEN THEN ELSE END的用法

    千次阅读 2016-03-21 11:20:46
    sql学习之CASE WHEN THEN ELSE END的用法
  • 自从做android开发后就很少接触sql代码的编写,前段时间一朋友问我一到sql面试题,咋眼一看这不是挺简单的嘛对两列做GROUP BY不就可以了, select id , dates,count(1) from data GROUP BY dates,result 写了之后...
  • 主要是两种使用场景:一是类似java中的if…else;二是用于进行行转列的查询(参看以下链接场景3 的例子https://blog.csdn.net/rongtaoup/article/details/82183743)。 一般都是放在select 子句后面的,充当的是字段...
  • case when多条件排序等强大用法

    千次阅读 2019-01-24 16:12:52
    最近在做项目中一直用到case when,在各种场景下都能用到,真的感觉是好强大,贼牛逼,废话不多说,直接上实例 一.多条件排序 项目中有这么一个需求,标签列表展示,按照已领用的普通卡排第一位,已领用的临时卡排...
  • when与what time询问时间有何讲究?

    千次阅读 2012-04-26 14:56:56
    when与what time都可以用来询问时间,意为“什么时候”,但它们并不完全等同。在不同的语境下,它们的使用还是有一定讲究的,也就是说,它们有时可以互换,有时却不能。具体用法如下: 一、询问做某事的时间(钟点)时,两者...
  • union联合查询和case when用法

    千次阅读 2016-05-24 09:36:21
    UNION 操作符用于合并两个或多个 SELECT 语句的结果集。 请注意,UNION 内部的 SELECT 语句必须拥有相同数量的列。列也必须拥有相似的数据类型。...如果允许重复的值,请使用 UNION ALL。 UNION 指令的目的
  • hive 中的case when嵌套与if用法实战

    千次阅读 2019-08-25 21:14:02
    1. 用法一览 if(条件表达式,结果1,结果2)相当于三目运算符,当条件表达式的结果为true时返回结果1,false时返回结果2。 注意: if后面的表达式类型可以不一样 -- 此表达式结果返回: 'hello' 「string类型」...
  • 本文将分别介绍各个函数的用法。 1、IF( expr , v1 , v2 ) 如果表达式expr的值为TURE,则IF()的返回值为v1; 如果表达式expr是值为FALSE,则IF()的返回值为v2。 IF()的返回值为数字值或者字符串,具体情况视其所在...
  • 1.使用choose结合when标签实现多分支的判断选择作为条件。类似于java中的switch..case的用法,满足其中一个就break。 <select id="getRejectORUnFinishedList" resultType=...
  • 记录下几个函数的使用substring是切割函数,可以切割指定字符先select version 切割 一定别忘了看用 select 1,1就是说从1开始的到第1个字符改变获取第二个字符依次加就可以一个一个的获取如果在mysql中做判断的...
  • case when then 中判断null的方法

    千次阅读 2018-05-18 11:24:46
    Sql 中使用case when then 判断某字段是否为null,和判断是否为 字符 或 数字 时的写法不一样:如果不注意,很容易搞错:错误方法:(已实践,的确是不行。虽然不会报错,但是结果不对的)CASE columnName WHEN null THEN...
  • 在这里使用 case when then(多用于分类统计) SELECT CASE WHEN age < 30 THEN '30岁以下' WHEN age BETWEEN 30 AND 35 THEN '30-35岁' WHEN age BETWEEN 36 AND 40 THEN '36-40岁' WHEN age > 40 THEN '...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 263,932
精华内容 105,572
关键字:

when表时间用法