SQL [Sybase] 於輸出數值前方補上0
參考來自這篇文章,只是 Sybase SQL 的指令不如 Microsoft 來得多,所以改寫成自己要的方式。
很多時候,公家機關特別喜歡的EDI格式都是固定長度的欄位資料,尤其是數字前面要補零的。
在 SQL 語法上就沒那麼便利像 Powerbuilder 的 String 指令,可以直接給一個 Format,
因此就需要一點變通了,
先來看一看舊式寫法好了,這是使用長度計算後的捕入方式:
Convert(varchar , @Number) 將該數值先轉換成字串值,使用 varchar 可以得到與數值相同字元長度的字串。
@Digits - char_length(Convert(varchar , @Number)) 算出長度差異,也就是需要補0的長度。
用 replicate('0', n) 來補入 n 個字元長度的 0 字元。
如果利用運算的方式來產生:
哇...簡單多了,先用 POWER(10, @Digits) 來算出 10 的 8 次方,這可以得到 100000000 的數值,
然後把它加上原本的數值可以得到 100000123 ,並將它轉為 varchar 字串,
此時可以得到 100000123 的 9 個字元,然後只取右邊起 8 個字元長度的字串,大功告成。
另外一種,也很簡單,其實算是第一種例子的變化:
直接產生對 8 字元長度的 0 字串,然後合併上用 Varchar 轉換的數值,
再擷取右邊 8 字元長度的內容就完成了。
很多時候,公家機關特別喜歡的EDI格式都是固定長度的欄位資料,尤其是數字前面要補零的。
在 SQL 語法上就沒那麼便利像 Powerbuilder 的 String 指令,可以直接給一個 Format,
因此就需要一點變通了,
先來看一看舊式寫法好了,這是使用長度計算後的捕入方式:
DECLARE @Number INT ,@Digits INT ,@Result CHAR(8)
SELECT @Number = 123
SELECT @Digits = 8
SELECT replicate('0',@Digits - char_length(Convert(varchar , @Number)))+Convert(varchar , @Number)
Convert(varchar , @Number) 將該數值先轉換成字串值,使用 varchar 可以得到與數值相同字元長度的字串。
@Digits - char_length(Convert(varchar , @Number)) 算出長度差異,也就是需要補0的長度。
用 replicate('0', n) 來補入 n 個字元長度的 0 字元。
如果利用運算的方式來產生:
DECLARE @Digits INT ,@Number INT
SELECT @Number = 123
SELECT @Digits = 8
SELECT Right(Convert(Varchar,Power(10, @Digits) + @Number),@Digits )
哇...簡單多了,先用 POWER(10, @Digits) 來算出 10 的 8 次方,這可以得到 100000000 的數值,
然後把它加上原本的數值可以得到 100000123 ,並將它轉為 varchar 字串,
此時可以得到 100000123 的 9 個字元,然後只取右邊起 8 個字元長度的字串,大功告成。
另外一種,也很簡單,其實算是第一種例子的變化:
DECLARE @Digits INT ,@Number INT
SELECT @Number = 123
SELECT @Digits = 8
SELECT Right(replicate('0',@Digits) + Convert(Varchar , @Number) , @Digits)
直接產生對 8 字元長度的 0 字串,然後合併上用 Varchar 轉換的數值,
再擷取右邊 8 字元長度的內容就完成了。
留言