日期:2014-05-16  浏览次数:20469 次

两张表针对某一字段判重的SQL疑问
现有两张表A、B,表结构一致。针对表内字段column1(该字段存放的是标准的诉讼审理的案号,例如:2012金婺商初字第00717号),对两张表判重,判重规则如何如下:
1、要排除全半角导致的不一致
2、“()〔〕第号字,/<>》《.{}空格”做为忽略词进行判重(特别提示,“- 、-”是参与判重的)
3、若“第”“号”之间的数字是以“0”开头(一个或多个),这些零也是忽略词(只是数字中开头的零)
针对于上面的规则,我的思路如下:对于1来说,在java里面有全角半角转化的规则,即转化为ASCII之后减去某一个特定的数字。但是在sqlserver的SQL语句里面怎么能够直接操作?对于2来说相对简单,在比较的时候直接replace为空串即可,但是3我一直没想出好的方法,如果写存储过程然后插入两张临时表,最后用临时表进行判重则比较麻烦,有木有更犀利一点的方法?最后啊能够直接用sqlsever字符串处理函数在SQL里面直接操作。
求大神给点思路
------解决方案--------------------
引用:
我的理解可不可以把第和号之间的字符串类型表示为数值类型,然后数值类型的格式化。不知道sqlserver里面怎么进行格式化数值类型的:例如(int)00101==(int)101


这个思路不错,这个是第二种方法,通过转化为int,然后再次转化为varchar:
select V , 
       case when v like '%第0%号%'
                 then LEFT(v,patindex('%第0%号%',v))+
                      cast(cast(SUBSTRING(v,
                                          patindex('%第0%号%',v)+1,
                                          patindex('%号%',v)-patindex('%第%',v)-1) 
                                 as int) 
                            as varchar)+
                      SUBSTRING(v,patindex('%号%',v),LEN(v))
                      
            else null
       end as vv
from 
(
select 'y000yy第0001号xx000x' as v
)t
/*
V vv
y000yy第0001号xx000x y000yy第1号xx000x
*/