sql replace替换多个字符_如何用 SQL 找一个女朋友?

背景

作为一个sql boy,笔者认为写sql真的是很枯燥而且很简单的事情,但没想到身边的朋友竟然会写不出sql来,因此笔者突发灵感编写此文来梳理一下如何写sql,以及怎么样写好sql。

那么开头就以笔者今天做的一个需求为例吧,上班第一天,业务方提出了一个取数需求,要求获取指定条件的用户,且用户姓名要进行掩码处理。例如:

姓名为:“李四”,那么要输出"李*";

姓名为:“古力古丽”,那么要输出“古***”;

即只需要保留第一个字符,剩下的字符要用*替代。

刚一开始觉得这个蛮简单的,不就是一个sql的事情吗,正好玩了好几天可以缓解一下假期综合症。说来就开始搞呀。

梳理

看到这个需求的时候,我大概知道要实现这么一个功能,需要替换(regexp_replace)、截取(substr)函数,那么接着梳理一下:

先要获取第一个字符,即需要截取

然后要获取剩余字符并替换为*

看,不就是那么简单嘛,那么接下来随便整点测试数据验证一下思路是否正确。

1-- 1.首先获取第一个字符2select substr('你好',0,1)34-- 2.获取剩余字符长度,并替换*,这里需要先获取剩余字符5select substr('你好',2) --思考?这里为什么要从下标2开始呢?而不是从1开始?67-- 3.这里要进行替换(那就要使用regexp_replace函数实现了),注意:这里有个坑8select regexp_replace(substr('你好',2),'(.*)','*')  
24e7e555e0425777d7992640fe519e6c.png

what?为什么会有两个字符呢?完蛋,看样子是中文字符占用字节数的问题,那么就不能用正则替换这条路了,那接下来怎么搞?

曲线救国

刚才看到使用正则替换不能实现该需求,那怎么办?唉,先喝口茶吧,突然想到了python有一个可以生成重复字符的功能,即print("*"*5)。那sql是不是也可以实现呢?管他呢,先试试。

第一步仍然是要先获取第一个字符

那么接下来就要获取剩余字符的长度,这样不就可以通过重复生成指定长度的字符完成了嘛

那么问题又来了,hql有可以生成重复的函数吗?先搜搜看

b03bc0e93b1750ff5c9eccf32cc97511.png

果然眼神好的我,发现了repeat这个函数,那么我们就来试试吧

1-- 1.首先获取第一个字符2select substr('你好',0,1)34-- 2.先测试下repeat这个函数好不好使5select length(substr('你好',2)) --果然好使67-- 3.那么接下来拼接一下吧,其实后来发现不需要获取剩余字符的长度,我只需要获取完全字符长度再-1即可。因为需求只需要保留一个字符8select repeat('*',length('你好')-1)
3bd35e42c10995ca74d6e5c40aaafd42.png

赶紧结束这个需求吧

既然整个步骤拆解都已经测试ok了,那么我们把sql拼接一下吧

首先获取第一个字符

将剩余字符生成对应长度的替代字符

将1和2步进行拼接

1select concat(substr('你好',0,1),repeat('*',length('你好')-1))2select concat(substr('古力古丽',0,1),repeat('*',length('古力古丽')-1))
3a920e3fa2d5214630af40eaebe07b9a.png

最后说两句

笔者这里给出的需求虽然很简单,而且不复杂,如果读者有更好的思路可以一起讨论下,但对于所有的sql需求来说,其实整体步骤都是一样的。即

首先要分析需求,先要有一个解决思路,可以不先写sql,

然后根据自己的思路去进行拆解,然后每一步都用sql来实现

把所有拆解的步骤拼装在一起

最后是对这个sql的优化了

笔者这里说起来比较简单,但对于没有写过sql的同学来说还是比较难的,正如我们刷算法题,对于大部分程序员来说是一件比较痛苦的事情,一开始真的很难,其实难的是没有思路,不知道如何下手。但熟练了之后,相信又是另一种心态了。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值