平时主要做维护方面工作,开发工作较少,没怎么认真的写过几行plsql代码。昨日一同事打电话咨询一个小问题,当时觉得很简单,但一时又想不出怎么写,后来静下心来,终于把语句写出来了。其实语句非常简单,只不过是对plsql不熟而已,因此请开发大神莫要拍砖。看来以后还要多看一些开发类的书籍,以便不时之需啊。
去除一些细节,可以归纳为如下内容:表t包含两个字段,deptno字段为部门编号,id字段为身份证号。
-
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表写一条简单的语句:
-
select deptno,
-
(CASE length(id)
-
WHEN 18 THEN substr(id,1,6)||substr(id,9,9)
-
WHEN 15 THEN id
-
END) as id1
-
from t
t表数据记录:
-
SQL> select * from t;
-
DEPTNO ID
-
---------- ------------------------------
-
1 110108197211182718
-
1 110108721118271
-
3 110109721118271
-
1 110101198201019713
-
2 110103198201019713
执行CASE WHEN语句后输出结果如下,可以看到通过CASE WHEN语句成功的将18位身份证号转换为了15位。
-
SQL> select deptno,
-
(CASE length(id)
-
WHEN 18 THEN substr(id,1,6)||substr(id,9,9)
-
WHEN 15 THEN id
-
END) as id1
-
from t;
-
DEPTNO ID1
-
---------- ------------------------------
-
1 110108721118271
-
1 110108721118271
-
3 110109721118271
-
1 110101820101971
-
2 110103820101971
有了上述SQL后,剩下的就简单了,经验证结果正确。
-
SQL> select deptno,count(distinct(id1)) from
-
(select deptno,
-
(CASE length(id)
-
WHEN 18 THEN substr(id,1,6)||substr(id,9,9)
-
WHEN 15 THEN id
-
END) as id1
-
from t)
-
group by deptno;
-
DEPTNO COUNT(DISTINCT(ID1))
-
---------- --------------------
-
1 2
-
2 1
-
3 1
来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/29827284/viewspace-2138547/
,如需转载,请注明出处,否则将追究法律责任。