簡單SQL實現數據補零操作
朋友們,我們在對數據庫字段進行處理時,經常會把整數強制轉換為varchar類型,數字本身可分大小,但轉換為字符串之后,原來的大小概念就被顛覆了。
比如88和800兩個整數,在作為數字類型時,800大于88是毋庸置疑的,但轉換為字符串后,'800'和'88'的大小就被顛覆了,我們就做一個小實驗,權當做一個驗證,腳本如下:
- declare @num1 int=88;
- declare @num2 int=800;
- if cast(@num1 as varchar)>cast(@num2 as varchar)
- print '''88''大于''800'''
- else
- print '''800''大于''88''';
運行結果如下:
其實很容易理解,這是因為varchar大小的比較是從***位開始,比較其ascii碼大小,出現***個大于另一個時,那整個varchar的大小就這樣定了的。
基于這樣的邏輯,我們在將int轉為varchar時,可能要用來排序或者與其它字段進行合并,如果大小或者順序混亂了,對我們的操作可能就會有影響,那這種情況應該如何處理呢?
其實很簡單,我們可以固定轉換后的位數,不夠位數的在左側補零即可。比如我們固定7位,“88”對應的就是“0000088”、“800”對應的就是“0000800”,這時候再比較或者排序,就不會亂了。
那如何補零呢?道理非常簡單,我們先用6個零組成的字符串加上數字轉成的字符串,然后再使用right函數截取最右邊的7位就行了,參看下面的腳本:
- right('000000'+cast(@num1 as varchar),7)
這個方法是最簡單的,如果您覺得不過癮,也可以計算下int轉為varchar后的長度,根據長度再根據replicate函數制造缺失的零即可,參看下面的腳本:
- replicate('0',7-len(cast(@num1 as varchar)))+cast(@num1 as varchar)
明顯看上去***種方法更直觀。如果您還嫌不過癮,您也可以使用case語句判斷不同長度直接補不同位數的零,參看下面的腳本:
- case len(cast(@num1 as varchar))
- when 1 then '000000'+cast(@num1 as varchar)
- when 2 then '00000'+cast(@num1 as varchar)
- when 3 then '0000'+cast(@num1 as varchar)
- when 4 then '000'+cast(@num1 as varchar)
- when 5 then '00'+cast(@num1 as varchar)
- when 6 then '0'+cast(@num1 as varchar)
- when 7 then cast(@num1 as varchar)
- end;
這明顯有點作了,相信沒幾個人會這么干,但這種方法也是可行的。
各種方式處理的效果參看下圖:
同理,如果您想在右邊補零,道理也是一樣的,這里要用到left函數,比如可以這樣:
- left(cast(@num1 as varchar)+'000000',7)
不過是在后面補零,從左邊截取而已。
希望對您有所幫助!























