2010-04-04 110 views
6

場景:SQL Server將字符串列值連接到5字符長

我有一個table1(col1 char(5)); table1中的值可能爲'001'或'01'或'1'。

要求:

在col1中的任何值,我需要以「0」以檢索它在5焦炭長度串連,使之5焦長。

技術我申請:

select right(('00000' + col1),5) from table1; 

我看不出有任何理由,爲什麼它不工作?但事實並非如此。 任何人都可以幫助我,我如何才能達到理想的效果?

回答

12

由於您使用的是固定寬度的列,因此它已經是5號(帶有空格)。你需要修剪:

DECLARE @table1 TABLE (col1 char(5)) 

INSERT INTO @table1 (col1) VALUES ('12345') 
INSERT INTO @table1 (col1) VALUES ('1') 

SELECT RIGHT('00000'+RTRIM(col1),5) FROM @table1 

-- Output: 
-- 12345 
-- 00001 

或者使用varchar代替:

DECLARE @table2 TABLE (col1 varchar(5)) 

INSERT INTO @table2 (col1) VALUES ('12345') 
INSERT INTO @table2 (col1) VALUES ('1') 

SELECT RIGHT('00000'+col1,5) FROM @table2 

-- Output: 
-- 12345 
-- 00001 
+0

謝謝邁克爾。 – niceApp 2010-04-04 02:09:54

+1

沒問題。這裏有另一個你可能遇到的SQL Server問題,這次用'varchar'列:如果你沒有指定長度,他們默認爲30. http://stackoverflow.com/questions/359257/why-is-the- default-length-for-varchar-30-when-using-cast – 2010-04-04 02:20:47

+0

+1不使用REPLICATE ;-)示例:http://stackoverflow.com/questions/3151503/tsql-scalar-function-need-to-return -a-級聯價值/ 3151781#3151781 – gbn 2010-07-02 13:52:06

1

如果您要將數據存儲在CHAR字段中,您可能會得到空白緩衝空間。例如01 =「01」。如果你做了正確的(「00000」+值5),它仍然是原始值。您需要對該值執行RTRIM()或將數據存儲在VARCHAR字段中。

+0

謝謝薩克利 – niceApp 2010-04-04 02:10:35

0

問題是char(5)字段總是5個字符長,無論你放入什麼東西。如果在字段中插入「01」,存儲的值實際上是'01      '(注意尾部空格)。

試試這個:

select right(('00000' + replace(col1, ' ', '')), 5) 

編輯:我會離開這裏我的答案作爲一個例子,但使用RTRIM邁克爾的回答是好。

0

你需要存儲以一致的方式你的數據,因此你不需要編寫查詢格式化每個數據時間。這將解決您的現有數據:

UPDATE table1 
    SET col1= RIGHT('00000'+ISNULL(RTRIM(col1),''),5) 

現在每次您選擇的時間只有做到這一點:但是

SELECT col1 FROM table1 

,你必須確保數據正確格式化(前導零)每它插入的時間。我想補充一個檢查約束,以確保公正:

ALTER TABLE table1 ADD CONSTRAINT 
    CK_table1_col1 CHECK (LEN(col1)=5) 

,當你插入這樣做:

INSERT INTO table1 
     (col1, ... 
    VALUES 
     (RIGHT('00000'+ISNULL(RTRIM(@col1),''),5)