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

6

场景:

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

需求:

无论col1中的值是什么,我需要将其检索出来,并使用前导零将其连接到5个字符长度,使其成为5个字符长。

我采用的技术:

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

我没有看到任何原因,为什么它不起作用?但它确实没有起作用。有人可以帮助我吗,我该如何达到预期结果?

4个回答

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
没问题。这是另一个与varchar列有关的 SQL Server 陷阱,如果您没有指定长度,它们将默认为30。 https://dev59.com/inRC5IYBdhLWcg3wROpQ - Michael Haren
+1,不使用REPLICATE;-) 示例:http://stackoverflow.com/questions/3151503/tsql-scalar-function-need-to-return-a-concatenated-value/3151781#3151781 - gbn

1

如果您将数据存储在CHAR字段中,那么您可能会得到带有空格缓冲的正确空格。例如:01 =“01 ”。如果您执行RIGHT(“00000”+值,5),它仍将是原始值。您需要对该值执行RTRIM()或将数据存储在VARCHAR字段中。


0
问题在于char(5)字段始终是5个字符长,无论你放入什么。如果你将'01'插入到该字段中,实际存储的值是'01 '(请注意尾随空格)。
试试这个:
select right(('00000' + replace(col1, ' ', '')), 5)

编辑:我会把我的答案留在这里作为一个例子,但是Michael使用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)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接