2017-04-14 86 views
0

我正在使用SQL Server 2008.SQL Server填充0與RIGHT不工作

我有一個varchar(30)列,其中包含檢查號碼。如果使用信用卡付款,checknbr將是一個零長度的字符串。我需要使用前導零來填充這些數據,這樣整個輸出就是十位數字。如果沒有支票號碼,它應該是十個零。

這裏是我想看到的數據:

0000000000 
    0000000000 
    0000000114 
    0000000105 
    0000000007 

這是我一直在使用和我被困在查詢:

SELECT RIGHT((CASE 
     WHEN LEN(checknbr) = 0 THEN '0000000000' 
     ELSE '0000000000'+checknbr 
    END),10) as checknbr 
    FROM payhistory 
    WHERE number = 12345678 

而這就是我得到:

0000000000 
    0000000000 
    114 
    105 
    7 

嘗試另一種方式:

SELECT RIGHT('0000000000'+checknbr,10) 
    FROM payhistory 
    WHERE number = 3861821 

我得到了同樣的結果。奇怪的是,我有一個varchar(10)列,其中

RIGHT('0000'+EDC.DatabaseNumber,4) 

產生的結果正是我之後的結果。我在這裏錯過了什麼?有關RIGHT功能的怪癖?

在此先感謝

+0

你如何觀測結果? –

回答

3

如果您正在使用SQL Server 2012或向上嘗試以下操作:

SELECT RIGHT(CONCAT('0000000000', checknbr), 10) 

的毗連將自動轉換NULL值空字符串,消除了對額外檢查的需求。

順便說一下,您遇到的問題是,您的查詢仍然將checknbr視爲數字而不是varchar值。將它投射到varchar將爲您解決這個問題。

編輯的SQL Server 2008:

既然你有沒有NULL VARCHAR列值仍然出現在腦海的尾隨空格的唯一的事情。嘗試:用cast()convert()checknbr轉換爲字符值

SELECT RIGHT('0000000000' + RTRIM(checknbr), 10); 
+0

對不起,感到困惑。我正在使用SQL Server 2008,並已編輯我的帖子來澄清。 至於轉換問題,我不明白如何查詢可以查看checknbr作爲一個數字,當它是一個varchar(30)列已經。當我CONVERT(VARCHAR(10),checknbr)並做同樣的查詢,我仍然得到相同的結果。 – LegalEagle

+0

@LegalEagle在這種情況下,它很好奇。你是否檢查過你的空間值? 'RTRIM(checknbr)' – Jens

+0

你解決了它!在我的CONVERT語句中使用RTRIM(checknbr)修復了它!謝謝!!!! – LegalEagle

0

將解決'0000000000'隱式轉換爲整數0

select right('0000000000'+convert(varchar(10),checknbr),10) 
from payhistory 
where number = 3861821 

如果checknbr可以null,你希望它回來作爲'0000000000',那麼你可以用它在coalesce()isnull()

select right('0000000000'+isnull(convert(varchar(10),checknbr),''),10) 
from payhistory 
where number = 3861821 

如果checknbr不是一個數字,而是varchar(30) ,那麼(正如Jens指出的那樣),你可能已經填充了需要修剪的空間:

rextester演示:http://rextester.com/IRLV83801

create table payhistory (checknbr varchar(30)); 
insert into payhistory values ('0'), ('1'), ('   0'), ('0   '),('   '); 

select checknbr = right('0000000000'+checknbr,10) 
from payhistory 

回報:

+------------+ 
| checknbr | 
+------------+ 
| 0000000000 | 
| 0000000001 | 
|   0 | 
| 0   | 
|   | 
+------------+ 

如果你修剪填充的空間:

select checknbr = right('0000000000'+ltrim(rtrim(checknbr)),10) 
from payhistory 

回報:

+------------+ 
| checknbr | 
+------------+ 
| 0000000000 | 
| 0000000001 | 
| 0000000000 | 
| 0000000000 | 
| 0000000000 | 
+------------+ 
+0

我只是嘗試這樣做: 'SELECT RIGHT( '0000000000' + CONVERT(VARCHAR(10),checknbr),10) FROM payhistory 其中number = 3861821' ,它在原來的職位產生完全相同的結果。 當沒有值時,Checknbr是一個空字符串。該列中沒有空值。 – LegalEagle