巧用SQL语句处理不规则字段
发布日期:2015-04-09 601次
浏览次数:计算机审计过程中,经常会遇到因为字段不规则而无法进行表间连接的情况。在某次审计中,审计人员需要将从房管局取得的购房人员明细表与涉案人员表进行连接,以便审查相关涉案人员名下是否有多套房产的情况。
房管局提供的购房人员明细表的结构包括出卖人、买受人、证件号码、房屋坐落、建筑面积、总价、出售时间等。正常情况是一个出卖人对应一个买受人,如XX房地产有限公司——李XX,这样的结构可以方便审计人员直接将该表与涉案人员表利用买受人姓名相同这个条件进行表间连接。但是实际上表中却存在许多一个出卖人对应两个买受人的情况,如XX房地产有限公司——李XX,张XX,这样的不规则结构就无法直接利用买受人姓名相同的条件进行连接,而且审计人员发现这样的记录数是非常多的,仅靠人工分类是耗时耗力甚至无法完成。
针对上述问题,审计人员采取了以下方法巧妙地解决了这个问题。
第一步:检索所有买受人字段的长度。select len(买受人),COUNT(LEN(买受人)) from 总表 group by len(买受人) order by len(买受人)。查询得出有5位、6位、7位等几种情况。
第二步:以6位为例,一般为李X,张XX(2位,3位)或者张XX,李X(3位,2位)的情况(标点符号占1位),此种情况第三位或第四位是类似“,”“、”“/”等标点符号。
先生成一张买受人字段长度为6位的新表。select * into 长度五 from 总表 where len(买受人)=6。
再根据标点符号位置生成分类后的新表。select * into 总表1 from 长度六 where substring(买受人,3,1)=',' or substring(买受人,3,1)='/' or substring(买受人,3,1)='、'以及select * into 总表2 from 长度六 where substring(买受人,4,1)=',' or substring(买受人,4,1)='/' or substring(买受人,4,1)='、'。
第三步:对生成的新表进行字段分离。
(1)第三位是标点符号的字段形式为“李X,张XX”,分离的语句:
左半段为select 出卖人,left(买受人,2)买受人,left(证件号码,18)证件号码 into 分离表1 from 总表1,
右半段为select 出卖人,right(买受人,3)买受人,right(证件号码,18)证件号码 into 分离表2 from 总表1;
(2)第四位是标点符号的字段形式为“张XX,李X”,分离的语句:
左半段为select 出卖人,left(买受人,3)买受人,left(证件号码,18)证件号码 into 分离表3 from 总表2,
右半段为select 出卖人,right(买受人,2)买受人,right(证件号码,18)证件号码 into 分离表4 from 总表2。
同样,针对字段长度为5,7等情况的采用相同办法即可,只需要判断标点符号是在第几位。
经过上述处理,将分离出来的几张表汇总成一张表,就可以直接与涉案人员表进行连接,以方便审计人员直接进行查询。(刘腾)
巧用SQL语句处理不规则字段
发布日期:2015-04-09 601次
浏览次数:计算机审计过程中,经常会遇到因为字段不规则而无法进行表间连接的情况。在某次审计中,审计人员需要将从房管局取得的购房人员明细表与涉案人员表进行连接,以便审查相关涉案人员名下是否有多套房产的情况。
房管局提供的购房人员明细表的结构包括出卖人、买受人、证件号码、房屋坐落、建筑面积、总价、出售时间等。正常情况是一个出卖人对应一个买受人,如XX房地产有限公司——李XX,这样的结构可以方便审计人员直接将该表与涉案人员表利用买受人姓名相同这个条件进行表间连接。但是实际上表中却存在许多一个出卖人对应两个买受人的情况,如XX房地产有限公司——李XX,张XX,这样的不规则结构就无法直接利用买受人姓名相同的条件进行连接,而且审计人员发现这样的记录数是非常多的,仅靠人工分类是耗时耗力甚至无法完成。
针对上述问题,审计人员采取了以下方法巧妙地解决了这个问题。
第一步:检索所有买受人字段的长度。select len(买受人),COUNT(LEN(买受人)) from 总表 group by len(买受人) order by len(买受人)。查询得出有5位、6位、7位等几种情况。
第二步:以6位为例,一般为李X,张XX(2位,3位)或者张XX,李X(3位,2位)的情况(标点符号占1位),此种情况第三位或第四位是类似“,”“、”“/”等标点符号。
先生成一张买受人字段长度为6位的新表。select * into 长度五 from 总表 where len(买受人)=6。
再根据标点符号位置生成分类后的新表。select * into 总表1 from 长度六 where substring(买受人,3,1)=',' or substring(买受人,3,1)='/' or substring(买受人,3,1)='、'以及select * into 总表2 from 长度六 where substring(买受人,4,1)=',' or substring(买受人,4,1)='/' or substring(买受人,4,1)='、'。
第三步:对生成的新表进行字段分离。
(1)第三位是标点符号的字段形式为“李X,张XX”,分离的语句:
左半段为select 出卖人,left(买受人,2)买受人,left(证件号码,18)证件号码 into 分离表1 from 总表1,
右半段为select 出卖人,right(买受人,3)买受人,right(证件号码,18)证件号码 into 分离表2 from 总表1;
(2)第四位是标点符号的字段形式为“张XX,李X”,分离的语句:
左半段为select 出卖人,left(买受人,3)买受人,left(证件号码,18)证件号码 into 分离表3 from 总表2,
右半段为select 出卖人,right(买受人,2)买受人,right(证件号码,18)证件号码 into 分离表4 from 总表2。
同样,针对字段长度为5,7等情况的采用相同办法即可,只需要判断标点符号是在第几位。
经过上述处理,将分离出来的几张表汇总成一张表,就可以直接与涉案人员表进行连接,以方便审计人员直接进行查询。(刘腾)