- 要看结果直接最后一行。
- 因为sql?server我看到的正则,需要先自己定义很多东西,对新手来说操作很繁琐,我考虑大部分情况我们只需要用到很简单的匹配,所以想着有没有简单的实现办法
- 我遇到一个问题,一个老系统,数据量很大,而且多种类型数据都在同一个表mmf中(假装有数据类型a、b、c),要筛选出b数据。
- 于是我从b数据的code入手,b数据分为老数据和新数据,新的数据格式统一,2数字+3英文+4数字,比如:72YSD0123。?或者出现子类:72YSD0123-2
- mysql可以直接用正则,但是这个系统是sql?server,为了替换正则,我第一反应,字符串需要某个字符,就是like,于是where代码如下:
-
select * from mmf where (mmf.code like '2%' or mmf.code like '3%' or mmf.code like '4%' or mmf.code like '5%' or mmf.code like '6%' or mmf.code like '7%' or mmf.code like '8%' or mmf.code like '9%' or mmf.code like '0%' or mmf.code like '1%') and (mmf.code like '%A%' or mmf.code like '%B%' or mmf.code like '%C%' or mmf.code like '%D%' .....) // 这里我直接从A肝到Z,很蠢很萌的写法,23333
-
- 但是遇到了问题,比如826YS123这样的老数据也查出来了,所以下定决心要定位匹配,于是用isnumberc和substring函数判断截取字符串是否是数字
-
select * from mmf where ISNUMERIC(SUBSTRING(mmf.code,1,2)) = 1 and ISNUMERIC(SUBSTRING(mmf.code,3,3)) = 0 and ISNUMERIC(SUBSTRING(mmf.code,6,4)) = 1
-
-
但是又遇到了问题,数据结果23Y123,230S11,这样的数据也出来,也就是这里有两个问题
-
Y12是字符串,0S1也是字符串,不符合我连续3个英文要求
-
某位3这样不足4位,也满足SubString(code,6,4)的判断
-
所以我决定英文需要一个个对比,然后增加长度判定,最后加上小概率出现的子类判断
-
- 最终结果:
select *?from?mmf? // 头两个是数字 where ISNUMERIC(SUBSTRING(mmf.code,1,2)) = 1 // 接下来3个是英文 and ISNUMERIC(SUBSTRING(mmf.code,3,1)) = 0 and ISNUMERIC(SUBSTRING(mmf.code,4,1)) = 0 and ISNUMERIC(SUBSTRING(mmf.code,5,1)) = 0 // 4个数字 and ISNUMERIC(SUBSTRING(mmf.code,6,4)) = 1 // 规范长度是9 and (len(mmf.code) = 9 // 有子类,加了-和1个数字编号 or (len(mmf.code) = 11 and ISNUMERIC(SUBSTRING(mmf.code,10,1)) = 0 and ISNUMERIC(SUBSTRING(mmf.code,11,1)) = 1) )
?
- 分析结论:正常只需要先截取字符串,然后做判断处理即可
- 截取字符串:SUBSTRING(字符串,从1开始的第几个位置,长度多少)? ??
- 字符串长度:len(mmf.code)
- 是否是数字判断:ISNUMERIC(字符串),是数字为1,不是为0
- 直接用等于判断是否是某个字符
用户登录
还没有账号?立即注册
用户注册
投稿取消
文章分类: |
|
还能输入300字
上传中....