SQL:利用正则替换数据库字段里的特定字符串

  今天IT交流群里有朋友提了个问题:
  表:k0904sour,字段:sour,数值举例:
  07:43,11:32,12:53,17:32,18:19,21:45
  07:37,11:33,12:35,17:33,18:21,21:50
  该字段是记录考勤打卡时间的,要求:清除18时以后的记录。
  刚开始有人提到在Rplace函数里用通配符,但Rplace不支持通配符。一下子没了主意,我就提议读取数据,然后处理完了再写回去。虽然是个办法,但如果数据量大的话,效率不高。
  我的毛病又来了,一个问题不找到个完美的解决办法总觉得心里不舒服。考虑到问题的特殊性,很可能需要用到正则表达式,于是继续查资料,终于找到了个函数patindex。[color=Blue]此函数返回指定表达式中某模式第一次出现的起始位置;如果在全部有效的文本和字符数据类型中没有找到该模式,则返回零。[/color]。有了这个函数就可以和SUBSTRING配合来处理了。
  刚开始想到的是,为了避免未包含状态下用这函数替换会出错,于量每个时间段写一个语句后面通过like判断是否包含,总共需要6个语句,如包含18时这一时间段的:[code]update k0904sour set sour=substring(sour,1,patindex('%,18:%',sour)-1) where sour like '%,18:%'[/code]
  如感觉这语句写得不够好,力求完美,再改进改进。眼睛再次看向patindex,可以把它用到条件里啊,再加上正则,这样一来就能精简语句了,两条语句就搞定:[code]update k0904sour set sour=substring(sour,1,patindex('%,1[8-9]:%',sour)-1) where patindex('%,1[8-9]:%',sour)>0
update k0904sour set sour=substring(sour,1,patindex('%,2%',sour)-1) where patindex('%,2%',sour)>0[/code]
  总结:对SQL中的某些函数没有接触过,以至于走了些弯路,看来基础还有待扎实。不过,只要善于思考,善于查资料,有些看似复杂的问题,也能迎刃而解。
  一切难问题都是纸老虎,我们不要被吓倒 🙂