2012年1月4日 星期三

SQL [Sybase] 於輸出數值前方補上0

參考來自這篇文章,只是 Sybase SQL 的指令不如 Microsoft 來得多,所以改寫成自己要的方式。

很多時候,公家機關特別喜歡的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 字元長度的內容就完成了。


0 個回應: