场景:
我有一个表table1(col1 char(5)); table1中的值可能是'001'、'01'或'1'。
需求:
无论col1中的值是什么,我需要将其检索出来,并使用前导零将其连接到5个字符长度,使其成为5个字符长。
我采用的技术:
select right(('00000' + col1),5) from table1;
我没有看到任何原因,为什么它不起作用?但它确实没有起作用。有人可以帮助我吗,我该如何达到预期结果?
场景:
我有一个表table1(col1 char(5)); table1中的值可能是'001'、'01'或'1'。
需求:
无论col1中的值是什么,我需要将其检索出来,并使用前导零将其连接到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 ”。如果您执行RIGHT(“00000”+值,5),它仍将是原始值。您需要对该值执行RTRIM()或将数据存储在VARCHAR字段中。
select right(('00000' + replace(col1, ' ', '')), 5)
编辑:我会把我的答案留在这里作为一个例子,但是Michael使用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)
varchar
列有关的 SQL Server 陷阱,如果您没有指定长度,它们将默认为30。 https://dev59.com/inRC5IYBdhLWcg3wROpQ - Michael Haren