欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

sql server 正则简易替代方案

程序员文章站 2022-06-16 12:15:27
要看结果直接最后一行因为sqlserver我看到的正则,需要先自己定义很多东西,对新手来说操作很繁琐,我考虑大部分情况我们只需要用到很简单的匹配,所以想着有没有简单的实现办法我遇到一个问题,一个老系统,数据量很大,而且多种类型数据都在同一个表mmf中(假装有数据类型a、b、c),要筛选出b数据。于是我从b数据的code入手,b数据分为老数据和新数据,新的数据格式统一,2数字+3英文+4数字,比如:72YSD0123。或者出现子类:72YSD0123-2mysql可以直接用正则,但是这个系统是.....
  1. 要看结果直接最后一行。
  2. 因为sql server我看到的正则,需要先自己定义很多东西,对新手来说操作很繁琐,我考虑大部分情况我们只需要用到很简单的匹配,所以想着有没有简单的实现办法
  3. 我遇到一个问题,一个老系统,数据量很大,而且多种类型数据都在同一个表mmf中(假装有数据类型a、b、c),要筛选出b数据。
  4. 于是我从b数据的code入手,b数据分为老数据和新数据,新的数据格式统一,2数字+3英文+4数字,比如:72YSD0123。 或者出现子类:72YSD0123-2
  5. mysql可以直接用正则,但是这个系统是sql server,为了替换正则,我第一反应,字符串需要某个字符,就是like,于是where代码如下:
    1. 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
  6. 但是遇到了问题,比如826YS123这样的老数据也查出来了,所以下定决心要定位匹配,于是用isnumberc和substring函数判断截取字符串是否是数字
    1. 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 
  7. 但是又遇到了问题,数据结果23Y123,230S11,这样的数据也出来,也就是这里有两个问题

    1. Y12是字符串,0S1也是字符串,不符合我连续3个英文要求

    2. 某位3这样不足4位,也满足SubString(code,6,4)的判断

    3. 所以我决定英文需要一个个对比,然后增加长度判定,最后加上小概率出现的子类判断

  8. 最终结果:
    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) 
        )

     

  9. 分析结论:正常只需要先截取字符串,然后做判断处理即可
    1. 截取字符串:SUBSTRING(字符串,从1开始的第几个位置,长度多少)    
    2. 字符串长度:len(mmf.code)
    3. 是否是数字判断:ISNUMERIC(字符串),是数字为1,不是为0
    4. 直接用等于判断是否是某个字符

本文地址:https://blog.csdn.net/u013484186/article/details/110945369

相关标签: sql sqlserver