ITPub博客

首页 > 数据库 > Oracle > PLSQL条件(CASE WHEN)语句小应用

PLSQL条件(CASE WHEN)语句小应用

原创 Oracle 作者:13811135929 时间:2017-05-05 17:16:23 0 删除 编辑
  平时主要做维护方面工作,开发工作较少,没怎么认真的写过几行plsql代码。昨日一同事打电话咨询一个小问题,当时觉得很简单,但一时又想不出怎么写,后来静下心来,终于把语句写出来了。其实语句非常简单,只不过是对plsql不熟而已,因此请开发大神莫要拍砖。看来以后还要多看一些开发类的书籍,以便不时之需啊。
 去除一些细节,可以归纳为如下内容:表t包含两个字段,deptno字段为部门编号,id字段为身份证号。

点击(此处)折叠或打开

  1. SQL> desc t
     Name                                      Null?    Type
     ----------------------------------------- -------- ----------------------------
     DEPTNO                                             NUMBER
     ID                                                 VARCHAR2(30)
其中ID有18位的,也有15位的,18位和15位的样例如下:
18位身份证号:110108197211182718
15位身份证号:110108721118271
现在要统计每个部门人数,其中上述15位和18位的身份证号认为同一个人。
  背景已经说清楚了,怎么写语句呢?很显然要对id列进行一下简单的条件处理,然后在进行统计,这里就用到了case when语句。  具体语法如下
  
  根据上面的语法,我们可以基于t表写一条简单的语句:

点击(此处)折叠或打开

  1. select deptno,
  2. (CASE length(id)
  3.   WHEN 18 THEN substr(id,1,6)||substr(id,9,9)
  4.   WHEN 15 THEN id
  5. END) as id1
  6. from t
t表数据记录:

点击(此处)折叠或打开

  1. SQL> select * from t;
  2.     DEPTNO ID
  3. ---------- ------------------------------
  4.          1 110108197211182718
  5.          1 110108721118271
  6.          3 110109721118271
  7.          1 110101198201019713
  8.          2 110103198201019713
执行CASE WHEN语句后输出结果如下,可以看到通过CASE WHEN语句成功的将18位身份证号转换为了15位。

点击(此处)折叠或打开

  1. SQL> select deptno,
  2. (CASE length(id)
  3.   WHEN 18 THEN substr(id,1,6)||substr(id,9,9)
  4.   WHEN 15 THEN id
  5. END) as id1
  6. from t;
  7.     DEPTNO ID1
  8. ---------- ------------------------------
  9.          1 110108721118271
  10.          1 110108721118271
  11.          3 110109721118271
  12.          1 110101820101971
  13.          2 110103820101971
有了上述SQL后,剩下的就简单了,经验证结果正确。

点击(此处)折叠或打开

  1. SQL> select deptno,count(distinct(id1)) from
  2. (select deptno,
  3. (CASE length(id)
  4.   WHEN 18 THEN substr(id,1,6)||substr(id,9,9)
  5.   WHEN 15 THEN id
  6.  END) as id1
  7. from t)
  8. group by deptno;
  9.     DEPTNO COUNT(DISTINCT(ID1))
  10. ---------- --------------------
  11.          1 2
  12.          2 1
  13.          3 1






来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/29827284/viewspace-2138547/ ,如需转载,请注明出处,否则将追究法律责任。

下一篇: shell中$()与${}
请登录后发表评论 登录
全部评论

注册时间:2014-08-25

  • 博文量
    28
  • 访问量
    70030