精华内容
下载资源
问答
  • 简单Case函数Case搜索函数。 第一种 格式 : 简单Case函数 : case 列名 when 条件值1 then 选项1 when 条件值2 then 选项2....... else 默认值 end 第二种 格式 :Case搜索函数 case when 列名= 条件值1 then...

    case when的使用方法

    Case具有两种格式。简单Case函数和Case搜索函数。

    第一种 格式 : 简单Case函数 :

    case 列名
        when 条件值1 then 选项1
        when 条件值2 then 选项2.......
        else 默认值 end
    

    第二种 格式 :Case搜索函数

    case  
        when 列名= 条件值1 then  选项1
        when 列名=条件值2 then  选项2.......
        else 默认值 end
    

    case when 其实相当于switch用法
    结尾一定要加end。

    case when常用的使用场景

    1.比方说这种又有筛选又有搜索的地方,需要动态修改where来查询条件
    在这里插入图片描述

    /* 
      * $keyWords 传过来的搜索关键字
      * $status   传过来的筛选条件
      * userName ,status  表里的字段
      * case when $status then status=$status  判断 $status 值为true,走then后面的条件,后面的条件都不执行
      * else status=status  上面的条件 不成立,执行这个条件。 status=status 等同于查询全部 或者写成 1=1
    */
    $sql="select * from 表名 where userName like '%$keyWords%' and 
    	  case when $status then status=$status
    	  else status=status
    	  end"
    

    2.比方说在设计数据库时,习惯把用户性别用int存储('0’不男不女, '1’是女,'2’是男)

    $sql="select 
          case sex 
          when 0 then '不男不女'
          when 1 then '女'
          else '男' end 
          from 表名"
    
    展开全文
  • SQL之CASE WHEN用法详解

    万次阅读 多人点赞 2018-08-30 14:43:02
    简单CASE WHEN函数: CASE SCORE WHEN 'A' THEN '优' ELSE '不及格' END CASE SCORE WHEN 'B' THEN '良' ELSE '不及格' END CASE SCORE WHEN 'C' THEN '中' ELSE '不及格' END 等同于,使用CASE WHEN条件表达式...

    简单CASE WHEN函数:

    CASE SCORE WHEN 'A' THEN '优' ELSE '不及格' END
    CASE SCORE WHEN 'B' THEN '良' ELSE '不及格' END
    CASE SCORE WHEN 'C' THEN '中' ELSE '不及格' END

     等同于,使用CASE WHEN条件表达式函数实现:

    CASE WHEN SCORE = 'A' THEN '优'
         WHEN SCORE = 'B' THEN '良'
         WHEN SCORE = 'C' THEN '中' ELSE '不及格' END

     THEN后边的值与ELSE后边的值类型应一致,否则会报错。如下:

    CASE SCORE WHEN 'A' THEN '优' ELSE 0 END

    '优'和0数据类型不一致则报错: 

    [Err] ORA-00932: 数据类型不一致: 应为 CHAR, 但却获得 NUMBER

    简单CASE WHEN函数只能应对一些简单的业务场景,而CASE WHEN条件表达式的写法则更加灵活。

    CASE WHEN条件表达式函数:类似JAVA中的IF ELSE语句。

    格式

    CASE WHEN condition THEN result
    
    [WHEN...THEN...]
    
    ELSE result
    
    END

    condition是一个返回布尔类型的表达式,如果表达式返回true,则整个函数返回相应result的值,如果表达式皆为false,则返回ElSE后result的值,如果省略了ELSE子句,则返回NULL

    下面介绍几种常用场景。

    场景1:有分数score,score<60返回不及格,score>=60返回及格,score>=80返回优秀

    SELECT
        STUDENT_NAME,
        (CASE WHEN score < 60 THEN '不及格'
            WHEN score >= 60 AND score < 80 THEN '及格'
            WHEN score >= 80 THEN '优秀'
            ELSE '异常' END) AS REMARK
    FROM
        TABLE

     注意:如果你想判断score是否null的情况,WHEN score = null THEN '缺席考试',这是一种错误的写法,正确的写法应为:

    CASE WHEN score IS NULL THEN '缺席考试' ELSE '正常' END

    场景2:现老师要统计班中,有多少男同学,多少女同学,并统计男同学中有几人及格,女同学中有几人及格,要求用一个SQL输出结果。

    表结构如下:其中STU_SEX字段,0表示男生,1表示女生。

    STU_CODE STU_NAME STU_SEX STU_SCORE
    XM 小明 0 88
    XL 小磊 0 55
    XF 小峰 0 45
    XH 小红 1 66
    XN 晓妮 1 77
    XY 小伊 1 99
    SELECT 
    	SUM (CASE WHEN STU_SEX = 0 THEN 1 ELSE 0 END) AS MALE_COUNT,
    	SUM (CASE WHEN STU_SEX = 1 THEN 1 ELSE 0 END) AS FEMALE_COUNT,
    	SUM (CASE WHEN STU_SCORE >= 60 AND STU_SEX = 0 THEN 1 ELSE 0 END) AS MALE_PASS,
    	SUM (CASE WHEN STU_SCORE >= 60 AND STU_SEX = 1 THEN 1 ELSE 0 END) AS FEMALE_PASS
    FROM 
    	THTF_STUDENTS
    

    输出结果如下:

    MALE_COUNT FEMALE_COUNT MALE_PASS FEMALE_PASS
    3 3 1 3

    场景3:经典行转列,并配合聚合函数做统计

    现要求统计各个城市,总共使用了多少水耗、电耗、热耗,使用一条SQL语句输出结果

    有能耗表如下:其中,E_TYPE表示能耗类型,0表示水耗,1表示电耗,2表示热耗

    E_CODE E_VALUE  E_TYPE
    北京 28.50 0
    北京 23.51 1
    北京 28.12 2
    北京 12.30 0
    北京 15.46 1
    上海 18.88 0
    上海 16.66 1
    上海 19.99 0
    上海 10.05 0
    SELECT 
    	E_CODE,
    	SUM(CASE WHEN E_TYPE = 0 THEN E_VALUE ELSE 0 END) AS WATER_ENERGY,--水耗
    	SUM(CASE WHEN E_TYPE = 1 THEN E_VALUE ELSE 0 END) AS ELE_ENERGY,--电耗
    	SUM(CASE WHEN E_TYPE = 2 THEN E_VALUE ELSE 0 END) AS HEAT_ENERGY--热耗
    FROM 
    	THTF_ENERGY_TEST
    GROUP BY
    	E_CODE

     输出结果如下:

    E_CODE WATER_ENERGY ELE_ENERGY HEAT_ENERGY
    北京 40.80 38.97 28.12
    上海 48.92 16.66 0

    场景4:CASE WHEN中使用子查询

    根据城市用电量多少,计算用电成本。假设电能耗单价分为三档,根据不同的能耗值,使用相应价格计算成本。

     价格表如下:

    P_PRICE P_LEVEL P_LIMIT
    1.20 0 10
    1.70 1 30
    2.50 2 50

    当能耗值小于10时,使用P_LEVEL=0时的P_PRICE的值,能耗值大于10小于30使用P_LEVEL=1时的P_PRICE的值...

    CASE WHEN energy <= (SELECT P_LIMIT FROM TABLE_PRICE WHERE P_LEVEL = 0) THEN (SELECT P_PRICE FROM TABLE_PRICE WHERE P_LEVEL = 0)
        WHEN energy > (SELECT P_LIMIT FROM TABLE_PRICE WHERE P_LEVEL = 0) AND energy <= (SELECT P_LIMIT FROM TABLE_PRICE WHERE P_LEVEL = 1) THEN (SELECT P_PRICE FROM TABLE_PRICE WHERE P_LEVEL = 1)
        WHEN energy > (SELECT P_LIMIT FROM TABLE_PRICE WHERE P_LEVEL = 1) AND energy <= (SELECT P_LIMIT FROM TABLE_PRICE WHERE P_LEVEL = 2) THEN (SELECT P_PRICE FROM TABLE_PRICE WHERE P_LEVEL = 2)

     场景5:结合max聚合函数

    CASE WHEN 函数使用起来简单易懂,此篇文章只作了简单的使用介绍,还需在实际工作中根据业务场景不同来灵活使用。

     

    展开全文
  • 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
    
    展开全文
  • where后面case-when用法

    千次阅读 2019-12-11 15:31:15
     主要是想根据某个字段的不同,执行不同的where条件,很明显在Mysql下是可以直接通过case-when来写,但是oracle的case-when则不行,同样的sql修改成oracl的语法就会报错,不支持这种方式。但是如果真的存在这种业务...
    1. 准备测试数据,建表语句
      drop table test_table;
      create table test_table
      (
        col_a        NUMBER,
        col_b        NUMBER,
        col_c        VARCHAR2(5)
      )
      
      insert into test_table values(2, 1, '>');
      insert into test_table values(1, 2, '>=');
      insert into test_table values(2, 1, '<');
      insert into test_table values(1, 2, '<=');
      insert into test_table values(2, 2, '=');

       

    2. 测试目的

          主要是想根据某个字段的不同,执行不同的where条件,很明显在Mysql下是可以直接通过case-when来写,但是oracle的case-when则不行,同样的sql修改成oracl的语法就会报错,不支持这种方式。但是如果真的存在这种业务场景,我们可以迂回一下,多走一步来实现这种场景,达到同样的目的。

    1. MySQL数据库
      --Mysql支持这种写法,可以根据关键字来执行不同的条件
      --可以理解case-when函数在Mysql下是可以返回直接执行的表达式
      
      SELECT * FROM test_table WHERE 
      CASE col_c 
        WHEN '>' THEN col_a > col_b
        WHEN '>=' THEN col_a >= col_b
        WHEN '<' THEN col_a < col_b
        WHEN '<=' THEN col_a <= col_b
        WHEN '=' THEN col_a = col_b
      END

       

    2. Oracle
      --Orale数据库的case-when函数则不能返回直接执行的表达式
      --但是我们可以转个弯,在select关键字后,将关键字对应的
      --表达式的计算结果值存为临时列,然后将结果集当一张临时
      --表,在根据where条件去过滤数据
      select col_a, col_b, col_c from (
      select 
       col_a, col_b, col_c,
       (case when (col_c = '>' and (col_a - col_b) > 0) then 1  
          when (col_c = '>=' and (col_a - col_b) >= 0) then 1  
          when (col_c = '=' and (col_a - col_b) = 0) then 1  
          when (col_c = '<' and (col_a - col_b) < 0) then 1  
          when (col_c = '<=' and (col_a - col_b) <= 0) then 1
          else 0 
       end) as temp
      from test_table )
      where temp = 1
      

       

    展开全文
  • 虽然你可能以前用过这个关键字来创建字段,但是它还具有更多用法。例如,你可以在 WHERE 子句中使用 CASE。 首先让我们看一下 CASE 的语法。在一般的 SELECT 中,其语法如下: [code="java"]SELECT ...
  • IsNull SQL语句中CASE WHEN用法  【转】IsNull SQL语句中CASE WHEN用法收藏   【转】IsNull SQL语句中CASE WHEN用法 1、ISNULL   使用指定的替换值替换 NULL。     语法   ISNULL ( check_...
  • CASE WHEN 及 SELECT CASE WHEN用法

    万次阅读 多人点赞 2018-08-26 19:14:59
    简单Case函数Case搜索函数。 简单Case函数 CASE sex WHEN '1' THEN '男' WHEN '2' THEN '女' ELSE '其他' END   --Case搜索函数  CASE WHEN sex = '1' THEN '男'  WHEN sex = '2' THEN...
  • 一般用法1select (case when 1=2 or 'a' like '%b%' then 'a'when 1=4 or 'b' in ('b','bb') then 'b'else 'c' end)as testFieldfrom dual结果为b。多次when和java中else if一样 执行顺序是从前到后 当满足某个...
  • case when 用法

    2020-07-17 16:43:09
    select ID, (case when ID < 5 then '优秀' when ID < 8 and ID > 6 then '良好' else '不优秀' end) as asd from PDCC_BAS_EVENT where ID < 9;
  • NULL 博文链接:https://vernonchen163.iteye.com/blog/1908053
  • Case when用法

    2019-09-27 07:06:30
    A.name, (case when B.Status= 0 then '缺勤' when B.Status = 1 then '出勤' else '缺勤' end) as status from TB_Business_Student A left join TB_Business_Attendance B on A.id = B.Studentid where...
  • Hive case when 用法

    千次阅读 2019-11-25 16:02:53
    when coalesce(keya,'')<>'' then keya --then后面切勿带逗号,不然报错 when coalesce(par,'')<> '' and par like '%keya=%' and coalesce(str_to_map(par, ',', '=')['keya'],'')<>'' t...
  • CASE WHEN 用法

    千次阅读 2017-08-21 11:13:29
    SQL:select case when(转) CASE 可能是 SQL 中被误用最多的关键字之一。虽然你可能以前用过这个关键字来创建字段,但是它还具有更多用法。例如,你可以在 WHERE 子句中使用 CASE。    首先让我们看一下...
  • CASE WHEN 用法介绍

    2014-12-26 10:00:27
    SE WHEN sex = '1' THEN '男' ...2. CASE WHEN 在语句中不同位置的用法 2.1 SELECT CASE WHEN 用法 SELECT grade, COUNT (CASE WHEN sex = 1 THEN 1 /*sex 1为男生,2位女生*/ ELSE NULL
  • case when用法

    2019-09-17 20:13:21
    case when在mysql中,可以用于改变一些查询值,也可以用来动态拼接一些语句: 改变查询值: select (case "sex" when "0" then "男" when "1" then "女" else "妖" end) "性别"from "student"...
  • case when用法格式

    千次阅读 2019-05-10 17:21:21
    今天要改一个存储过程,了解了一下,在存储过程中和平时写的sql其语法格式是基本一致的,case when用法调用也是。 先行举例: select qzh from ywda_swjg_qzh_dz where swjg = ( select case when su...
  • oracle case when用法

    2014-04-23 13:33:07
    Oracle CASE WHEN 用法介绍 1. CASE WHEN 表达式有两种形式 --简单Case函数 CASE sex WHEN '1' THEN '男' WHEN '2' THEN '女' ELSE '其他' END --Case搜索函数 CASE WHEN sex = '1' ...
  • oracle case when 用法

    2016-05-05 15:47:34
    1. CASE WHEN 表达式有两种形式 --简单Case函数 CASE sex WHEN '1' THEN '男' WHEN '2' THEN '女' ELSE '其他' END --Case搜索函数 CASE WHEN sex = '1' THEN '男' WHEN sex = '2' THEN '女' ELSE '...
  • mysql case when 语句 放在 where 条件前,条件后的用法 case when 放在 where 语句之前,作为一列数据的过滤 case when 放在 where 语句之后 转载
  • CASE WHEN用法

    2016-11-04 11:34:34
    1. CASE WHEN 表达式有两种形式 --简单Case函数 CASE sex WHEN '1' THEN '男' WHEN '2' THEN '女' ELSE '其他' END --Case搜索函数 CASE WHEN sex = '1' THEN '男' WHEN sex = '2' THEN '女' ELSE '...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 48,098
精华内容 19,239
关键字:

where和when的用法