sql 截取_如何用 SQL 找一个女朋友?
背景
作為一個sql boy,筆者認為寫sql真的是很枯燥而且很簡單的事情,但沒想到身邊的朋友竟然會寫不出sql來,因此筆者突發靈感編寫此文來梳理一下如何寫sql,以及怎么樣寫好sql。
那么開頭就以筆者今天做的一個需求為例吧,上班第一天,業務方提出了一個取數需求,要求獲取指定條件的用戶,且用戶姓名要進行掩碼處理。例如:
姓名為:“李四”,那么要輸出"李*";
姓名為:“古力古麗”,那么要輸出“古***”;
即只需要保留第一個字符,剩下的字符要用*替代。
剛一開始覺得這個蠻簡單的,不就是一個sql的事情嗎,正好玩了好幾天可以緩解一下假期綜合癥。說來就開始搞呀。
梳理
看到這個需求的時候,我大概知道要實現這么一個功能,需要替換(regexp_replace)、截取(substr)函數,那么接著梳理一下:
先要獲取第一個字符,即需要截取
然后要獲取剩余字符并替換為*
看,不就是那么簡單嘛,那么接下來隨便整點測試數據驗證一下思路是否正確。
1--?1.首先獲取第一個字符2select?substr('你好',0,1)
3
4--?2.獲取剩余字符長度,并替換*,這里需要先獲取剩余字符
5select?substr('你好',2)?--思考?這里為什么要從下標2開始呢?而不是從1開始?
6
7-- 3.這里要進行替換(那就要使用regexp_replace函數實現了),注意:這里有個坑
8select?regexp_replace(substr('你好',2),'(.*)','*')??
what?為什么會有兩個字符呢?完蛋,看樣子是中文字符占用字節數的問題,那么就不能用正則替換這條路了,那接下來怎么搞?
曲線救國
剛才看到使用正則替換不能實現該需求,那怎么辦?唉,先喝口茶吧,突然想到了python有一個可以生成重復字符的功能,即print("*"*5)。那sql是不是也可以實現呢?管他呢,先試試。
第一步仍然是要先獲取第一個字符
那么接下來就要獲取剩余字符的長度,這樣不就可以通過重復生成指定長度的字符完成了嘛
那么問題又來了,hql有可以生成重復的函數嗎?先搜搜看
果然眼神好的我,發現了repeat這個函數,那么我們就來試試吧
1--?1.首先獲取第一個字符2select?substr('你好',0,1)
3
4--?2.先測試下repeat這個函數好不好使
5select?length(substr('你好',2))?--果然好使
6
7-- 3.那么接下來拼接一下吧,其實后來發現不需要獲取剩余字符的長度,我只需要獲取完全字符長度再-1即可。因為需求只需要保留一個字符
8select?repeat('*',length('你好')-1)
趕緊結束這個需求吧
既然整個步驟拆解都已經測試ok了,那么我們把sql拼接一下吧
首先獲取第一個字符
將剩余字符生成對應長度的替代字符
將1和2步進行拼接
2select?concat(substr('古力古麗',0,1),repeat('*',length('古力古麗')-1))
最后說兩句
筆者這里給出的需求雖然很簡單,而且不復雜,如果讀者有更好的思路可以一起討論下,但對于所有的sql需求來說,其實整體步驟都是一樣的。即
首先要分析需求,先要有一個解決思路,可以不先寫sql,
然后根據自己的思路去進行拆解,然后每一步都用sql來實現
把所有拆解的步驟拼裝在一起
最后是對這個sql的優化了
筆者這里說起來比較簡單,但對于沒有寫過sql的同學來說還是比較難的,正如我們刷算法題,對于大部分程序員來說是一件比較痛苦的事情,一開始真的很難,其實難的是沒有思路,不知道如何下手。但熟練了之后,相信又是另一種心態了。
往期推薦
2020年大廠面試題-高級Java開發篇
數據開發必經之路-數據傾斜
2020年大廠面試題-數據倉庫篇
元數據管理-技術元數據解決方案
一萬字完整總結Flume
Hive調優,數據工程師成神之路
SparkStreaming完整學習教程
數倉利器-Hive高頻函數合集
數據同步神器-Datax源碼重構
2020年大廠面試題-數據倉庫篇
0003-01-Hive常見問題匯總
zookeeper源碼解讀之-DataTree模型構建+Leader選舉
zookeeper源碼解讀之-服務端啟動流程
zookeeper源碼解讀之-源碼編譯
總結
以上是生活随笔為你收集整理的sql 截取_如何用 SQL 找一个女朋友?的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: sql计算留存_链家面试题:如何分析留存
- 下一篇: tomcat 多人登录cpu占用过多_服