SQL Server将字符串列的值连接为5个字符长

时间:2010-04-04 01:58:05

标签: sql sql-server database

情景:

我有一个table1(col1 char(5)); table1中的值可以是'001'或'01'或'1'。

要求:

无论col1中的值是多少,我都需要在5个字符长度内连接它,并使用前导'0'来使其为5个字符长。

我申请的技术:

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

我没有看到任何理由,为什么它不起作用?但事实并非如此。 任何人都可以帮助我,我怎样才能达到预期的效果?

4 个答案:

答案 0 :(得分: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

答案 1 :(得分:1)

如果要将数据存储在CHAR字段中,则可能正在使用空白缓冲空间。例如01 =“01”。如果你做右(“00000”+值,5)它仍然是原始值。您需要对值执行RTRIM()或将数据存储在VARCHAR字段中。

答案 2 :(得分:0)

问题是char(5)字段总是5个字符长,不管你输入什么。如果在字段中插入“01”,则存储的值实际上为“01”(请注意尾随空格)。

试试这个:

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

编辑:我将在此留下我的答案作为例子,但迈克尔使用rtrim的答案更好。

答案 3 :(得分: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)