sql 截取_如何用 SQL 找一个女朋友?

6a15e64e96c75d82acfb635d940272d6.png

背景

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

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

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

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

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

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

梳理

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

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

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

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

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

b9c54f5480f5ddac76311a313573ccc9.png

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

cb74bc80262014f957edb6a210a44b51.png

曲线救国

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

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

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

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

5667de77afbe96a381de762582cbd1ee.png

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

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

9ed1eb77a234da3b56afb5eeb39b3c18.png

赶紧结束这个需求吧

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

  1. 首先获取第一个字符

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

  3. 将1和2步进行拼接

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

a058df5472bb21b1e48d5fdb95f4edcd.png

最后说两句

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

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

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

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

  4. 最后是对这个sql的优化了

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

往期推荐

2020年大厂面试题-高级Java开发篇

数据开发必经之路-数据倾斜

2020年大厂面试题-数据仓库篇

元数据管理-技术元数据解决方案

一万字完整总结Flume

Hive调优,数据工程师成神之路

SparkStreaming完整学习教程

数仓利器-Hive高频函数合集

数据同步神器-Datax源码重构

2020年大厂面试题-数据仓库篇

0003-01-Hive常见问题汇总

zookeeper源码解读之-DataTree模型构建+Leader选举

zookeeper源码解读之-服务端启动流程

zookeeper源码解读之-源码编译

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值