sql函数的灵活使用:left、right、concat等的巧妙使用

今天在做系统功能的开发时,老大安排给我一个任务,如下图所示。将图中所有涉及到身份证号、手机号的信息脱敏,以防公司数据库用户信息数据被滥用。

​​​​​​sql函数的灵活使用:left、right、concat等的巧妙使用_第1张图片

乍一看这个需求蛮简单的,实际上也确实挺简单。但做起来,却不得不考虑一些地方。

原本数据的查询是通过一个存储过程来实现的,偷偷的告诉你,这个存储过程有将近两千行sql代码。其实吧,倒也正常。然后我就在这两千行代码中找需求需要改动的地方。很快的就找到了,

然后就对身份证号采用

if(ifnull(owner_id,"")="","",concat(left(owner_id,5),"***************"))

对手机号采用

concat(left(owner_phone,3),"*****",right(owner_phone,3))

能够熟练操作数据库的都能明白其中的道理,第一条sql是在业主身份证号不为空if()ifnull()的情况下,left()截取前五位、剩余的concat()拼接上*号然后返回;第二条是拼接手机号前3位、right()后3位、中间用*表示来返回。

稍微疏忽点就会感觉,这样写没毛病啊,没错,我也是这么认为的。然而,当我发给老大问购买人的信息需要脱敏不的时候,老大就发现了我疏忽的问题:像业主、主借款人这些可能不止一个人,会有多人的情况。那么这个时候,上面的写法就很有问题了。返回的数据只有第一个人的信息,甚至手机号这个是把第一个人的前三位和最后一个人的后三位拼一起的。

那么就需要修改写法了,首先想到的是sql可不可以像Java或者js那样类似split的方法。后来在百度了以后觉得SUBSTRING_INDEX(str,delim,count)挺像。可是后来使用的时候就发现它貌似不能解决这个问题,或者只是我没发现而已。

最后我就灵机一动,因为返回的数据也是2000行代码中某些代码查询出来然后用group_concat()拼接起来的。所以,可以修改拼接前的代码嘛。

只不过就是,需要修改的地方有很多,差不多一共近40个地方,都要按照上面的方法来修改。接着就对应修改好了,功能也完美的实现,再然后就提给测试、验收、65,一路炮轰,都通过了。今晚上线。

不得不说,sql真的很强大,特别是其提供的一些函数,很实用。不过,其实强大的东西多了。以上sql中的代码其实也可以用开发语言替代,比如Java,只不过就会更加麻烦了。无论是对系统、对开发者,还是对用户的使用来说,在取数据的时候直接处理是最好的办法。

文末附上本人的个人网站:哆啦日记,数个月的倾心之作,期待你的访问。

你可能感兴趣的:(MySQL,数据库,sql)