sql 语句之 case

case语句语法:
--简单Case函数
CASE sex
WHEN ‘1‘ THEN ‘男‘
WHEN ‘2‘ THEN ‘女‘
ELSE ‘其他‘ END
--Case搜索函数
CASE WHEN sex = ‘1‘ THEN ‘男‘
WHEN sex = ‘2‘ THEN ‘女‘
ELSE ‘其他‘ END

首先创建一张users表,其中包含id,name,sex三个字段,表内容如下:

复制代码
SQL> drop table users purge;

drop table users purge

ORA-00942: 表或视图不存在
SQL> create table users(id int,name varchar2(20),sex number);

Table created
SQL> insert into users(id,name) values(1,‘张一‘);

1 row inserted
SQL> insert into users(id,name,sex) values(2,‘张二‘,1);

1 row inserted
SQL> insert into users(id,name) values(3,‘张三‘);

1 row inserted
SQL> insert into users(id,name) values(4,‘张四‘);

1 row inserted
SQL> insert into users(id,name,sex) values(5,‘张五‘,2);

1 row inserted
SQL> insert into users(id,name,sex) values(6,‘张六‘,1);

1 row inserted
SQL> insert into users(id,name,sex) values(7,‘张七‘,2);

1 row inserted
SQL> insert into users(id,name,sex) values(8,‘张八‘,1);

1 row inserted
SQL> commit;

Commit complete
SQL> select * from users;

                                     ID NAME                        SEX
--------------------------------------- -------------------- ----------
                                      1 张一
                                      2 张二                          1
                                      3 张三
                                      4 张四
                                      5 张五                          2
                                      6 张六                          1
                                      7 张七                          2
                                      8 张八                          1

8 rows selected
复制代码
1、上表结果中的"sex"是用代码表示的,希望将代码用中文表示。可在语句中使用case语句:

复制代码
SQL> select u.id,u.name,u.sex,
  2    (case u.sex
  3      when 1 then ‘男‘
  4      when 2 then ‘女‘
  5      else ‘空的‘
  6      end
  7     )性别
  8  from users u;

                                     ID NAME                        SEX 性别
--------------------------------------- -------------------- ---------- ------
                                      1 张一                            空的
                                      2 张二                          1 男
                                      3 张三                            空的
                                      4 张四                            空的
                                      5 张五                          2 女
                                      6 张六                          1 男
                                      7 张七                          2 女
                                      8 张八                          1 男

8 rows selected
复制代码
2、如果不希望列表中出现"sex"列,语句如下:

复制代码
SQL> select u.id,u.name,
  2    (case u.sex
  3      when 1 then ‘男‘
  4      when 2 then ‘女‘
  5      else ‘空的‘
  6      end
  7     )性别
  8  from users u;

                                     ID NAME                 性别
--------------------------------------- -------------------- ------
                                      1 张一                 空的
                                      2 张二                 男
                                      3 张三                 空的
                                      4 张四                 空的
                                      5 张五                 女
                                      6 张六                 男
                                      7 张七                 女
                                      8 张八                 男

8 rows selected
复制代码
3、将sum与case结合使用,可以实现分段统计。
     如果现在希望将上表中各种性别的人数进行统计,sql语句如下:

复制代码
SQL> select
  2    sum(case u.sex when 1 then 1 else 0 end)男性,
  3    sum(case u.sex when 2 then 1 else 0 end)女性,
  4    sum(case when u.sex <>1 and u.sex<>2 then 1 else 0 end)性别为空
  5  from users u;

        男性         女性       性别为空
---------- ---------- ----------
         3          2          0

--------------------------------------------------------------------------------
SQL> select
  2    count(case when u.sex=1 then 1 end)男性,
  3    count(case when u.sex=2 then 1 end)女,
  4    count(case when u.sex <>1 and u.sex<>2 then 1 end)性别为空
  5  from users u;

        男性          女       性别为空
---------- ---------- ----------
         3          2          0

2.项目中实际应用

/**
     * 方法名称: findAucAgencyDealCount<br>
     * 描述: List 中的每一个对象都是一条记录<br>
     *       Object[]中下标值依次是对应的字段列<br>
     *       执行原生的sql连接查询<br>
     * @param startDate
     * @param endDate
     * @return 数组集合 即 List<Object[]>
     */
    @Query(value = "SELECT s.name as aucagencyName,sum(a.qty_auction) as aucLotCount,"
    +"sum(case when b.is_deal=1 and a.is_published=2 then b.qty_deal else 0 end) as aucLotDealCount,"
    +"sum(case when b.is_deal=1 and b.is_settled=1 and a.is_published=2 then b.qty_deal else 0 end) as factCount,"
    +"sum(case when b.is_deal=4 and a.is_published=2 then b.qty_deal else 0 end) as regretCount,"
    +"sum(case when a.is_published=2 and a.type=1 then 1 else 0 end) as shootnumber,"
    +"sum(case when a.is_published=2 and a.type=2 then 1 else 0 end) as sellnumber,"
    +"sum(case when a.is_published=2 and b.is_deal=1 and a.type=1 then 1 else 0 end) as aucLotDealnumber,"
    +"sum(case when a.is_published=2 and b.is_deal=1 and a.type=1 and b.is_priority=1 then 1 else 0 end) as firstnumber,"
    +"sum(case when a.is_published=2 and a.type=2 and b.is_deal=1 then 1 else 0 end) as sellDealnumber  "
    +"from auc_lot a left join auc_brand b on a.id=b.auc_id left join sys_agency s on a.agency_id=s.id "
    +"where (DATE_FORMAT(a.published_time,‘%Y-%m-%d‘) BETWEEN :startDate and :endDate) "
    + "and a.agency_id in (:agencyIds)"
    +"GROUP BY s.name",nativeQuery=true)
    List<Object> findAucAgencyDealCount(@Param("startDate") String startDate, @Param("endDate") String endDate,@Param("agencyIds") List<Long> agencyIds);
时间: 02-13

sql 语句之 case的相关文章

如何用ORM支持SQL语句的CASE WHEN?

OQL如何支持CASE WHEN? 今天,一个朋友问我,OQL可否支持CASE WHEN语句?他给的示例SQL如下: select HName,case when IsEnable=1 then '启用' else '停用' from tb_User OQL是SOD框架的ORM查询语言,它类似Linq,但是它诞生的历史比Linq早,并且更加接近SQL语法.所以,对SOD框架而言,对应ORM如何支持CASE WHEN,就等于是问OQL如何支持CASE WHEN了. 这个问题已经不止这一个朋友来问我

Oracle的sql语句中case关键字的用法

例子1: a)查询列中有"_"开头的列名时,需要用双引号引起来. b)使用"case"关键字,根据分数直接判断是否及格. create table tbl_score( id NUMBER(4), --id name varchar2(30), --名称 score NUMBER(3), --分数 otherscore NUMBER(3) --其他分数 ); select t.id as "_id", t.name as name, case w

sql语句:CASE WHEN END 的用法

select b,c, CASE a WHEN '1' THEN '1001' WHEN '2' THEN '1002' ELSE '1003' end from test1

Sql语句-case when then else end

依据上面的表信息输出以下的结果: 以下是建库和表结构据: create table DeptSales ( deptID int, SubjMonth int , sales int , deptname varchar(50) ) insert into deptsales (deptid ,subjmonth,sales) values (1,1,55); insert into deptsales (deptid ,subjmonth,sales) values (2,1,66); ins

oracle case where 复杂sql语句

update hr_user u set u.is_approve=(case when u.curr_org_id in (select t.org_id from hr_organization t start with t.org_id = 10001263 connect by prior org_id = t.org_id_parent) then 'N' ELSE 'Y' END); update hr_user u set u.is_approve=(case when u.cur

SQL中的条件判断语句(case when zhen if,ifnull)用法

一.case when then 适用于:sqlserver 和mysql case具有两种格式.简单case函数和case搜索函数.这两种方式,可以实现相同的功能.简单case函数的写法相对比较简洁,但是和case搜索函数相比,功能方面会有些限制,比如写判定式.还有一个需要注重的问题,case函数只返回第一个符合条件的值,剩下的case部分将会被自动忽略. --简单case函数case sex  when '1' then '男'  when '2' then '女’  else '其他' e

用sql语句导出oracle中的存储过程和函数

用sql语句导出oracle中的存储过程和函数: SET echo off ; SET heading off ; SET feedback off ; SPOOL 'C:/PRC.SQL' replace SELECT CASE WHEN LINE = 1 THEN 'CREATE OR REPLACE ' || TEXT WHEN LINE = MAX_LINE THEN TEXT || CHR(10 ) || '/' ELSE TEXT END FROM USER_SOURCE A LEF

【黑马Android】(04)数据库的创建和sql语句增删改查/LinearLayout展示列表数据/ListView的使用和BaseAdater/内容提供者创建

数据库的创建和sql语句增删改查 1. 加载驱动. 2. 连接数据库. 3. 操作数据库. 创建表: create table person( _id integer primary key, name varchar(20), age integer ); 添加: insert into person(name, age) values('lisi', 19); 删除: delete from person where _id = 1; 修改: update person set name =

标准sql语句,学习

标准SQL语句总结标准SQL语句总结,标准SQL语言基本上适用于下面所列出的数据库软件 ----------------------------------------------------------------------------- 数据库软件清单 A商业数据库软件如下 1.微软的MS SQL Server和Access 2.IBM的DB2,informax 3.Sybase的大型数据库ASE,中小型数据库ASA 4.甲骨文公司的Oracle8.0,oracle9i系列 5.Borla