情景:
我有一个table1(col1 char(5)); table1中的值可以是'001'或'01'或'1'。
要求:
无论col1中的值是多少,我都需要在5个字符长度内连接它,并使用前导'0'来使其为5个字符长。
我申请的技术:
select right(('00000' + col1),5) from table1;
我没有看到任何理由,为什么它不起作用?但事实并非如此。 任何人都可以帮助我,我怎样才能达到预期的效果?
答案 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)