2010-04-04 108 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)