我有一个table1(col1 char(5)); table1中的值可能为'001'或'01'或'1'。
要求:
在col1中的任何值,我需要以“0”以检索它在5焦炭长度串连,使之5焦长。
技术我申请:
select right(('00000' + col1),5) from table1;
我看不出有任何理由,为什么它不工作?但事实并非如此。 任何人都可以帮助我,我如何才能达到理想的效果?
我有一个table1(col1 char(5)); table1中的值可能为'001'或'01'或'1'。
要求:
在col1中的任何值,我需要以“0”以检索它在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”。如果你做了正确的(“00000”+值5),它仍然是原始值。您需要对该值执行RTRIM()或将数据存储在VARCHAR字段中。
谢谢萨克利 – niceApp 2010-04-04 02:10:35
问题是char(5)字段总是5个字符长,无论你放入什么东西。如果在字段中插入“01”,存储的值实际上是'01 '(注意尾部空格)。
试试这个:
select right(('00000' + replace(col1, ' ', '')), 5)
编辑:我会离开这里我的答案作为一个例子,但使用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)
谢谢迈克尔。 – niceApp 2010-04-04 02:09:54
没问题。这里有另一个你可能遇到的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
+1不使用REPLICATE ;-)示例:http://stackoverflow.com/questions/3151503/tsql-scalar-function-need-to-return -a-级联价值/ 3151781#3151781 – gbn 2010-07-02 13:52:06