我有一個table1(col1 char(5)); table1中的值可能爲'001'或'01'或'1'。
要求:
在col1中的任何值,我需要以「0」以檢索它在5焦炭長度串連,使之5焦長。
技術我申請:
select right(('00000' + col1),5) from table1;
我看不出有任何理由,爲什麼它不工作?但事實並非如此。 任何人都可以幫助我,我如何才能達到理想的效果?
我有一個table1(col1 char(5)); table1中的值可能爲'001'或'01'或'1'。
要求:
在col1中的任何值,我需要以「0」以檢索它在5焦炭長度串連,使之5焦長。
技術我申請:
select right(('00000' + col1),5) from table1;
我看不出有任何理由,爲什麼它不工作?但事實並非如此。 任何人都可以幫助我,我如何才能達到理想的效果?
由於您使用的是固定寬度的列,因此它已經是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
如果您要將數據存儲在CHAR字段中,您可能會得到空白緩衝空間。例如01 =「01」。如果你做了正確的(「00000」+值5),它仍然是原始值。您需要對該值執行RTRIM()或將數據存儲在VARCHAR字段中。
謝謝薩克利 – niceApp 2010-04-04 02:10:35
問題是char(5)字段總是5個字符長,無論你放入什麼東西。如果在字段中插入「01」,存儲的值實際上是'01 '(注意尾部空格)。
試試這個:
select right(('00000' + replace(col1, ' ', '')), 5)
編輯:我會離開這裏我的答案作爲一個例子,但使用RTRIM邁克爾的回答是好。
你需要存儲以一致的方式你的數據,因此你不需要編寫查詢格式化每個數據時間。這將解決您的現有數據:
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)
謝謝邁克爾。 – niceApp 2010-04-04 02:09:54
沒問題。這裏有另一個你可能遇到的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
+1不使用REPLICATE ;-)示例:http://stackoverflow.com/questions/3151503/tsql-scalar-function-need-to-return -a-級聯價值/ 3151781#3151781 – gbn 2010-07-02 13:52:06