1

我的表中有一个计算列,它在int另一列中添加零。使用以下内容:

client_id AS RIGHT('00000' + CAST(id AS nvarchar(5)) , 5) PERSISTED NOT NULL

基本上,它将 the 转换id为 a NVARCHAR(5),并在其前面加上00000然后抓取最右边的五个字符。这很好用,但是如果我的 id 号码大于 99999(因此是 6 位),它将删除第一个数字。这是意料之中的,但却是不受欢迎的。

我将如何创建一个计算列,该列从另一列 ( id) 中获取一个数字,然后强制使用以下格式00000,除非该数字大于 99999?

例子:

 00001  
 00002  
 00003  
 ..   
 00010  
 00100  
 01000  
 99999   
 ..   
100000  
100001

谢谢,我为令人困惑的标题道歉。

4

3 回答 3

1

然后使用CASE

SELECT client_id = CASE 
                 WHEN id > 99999 THEN id 
                 ELSE RIGHT('00000' + CONVERT(VARCHAR, id), 5) 
               END 
FROM   dbo.table1 

演示

请注意 ... charandnchar是固定长度的,即使您没有用完所有空间,也会为您指定的字符数保留存储空间。但是 varcharandnvarchar可变长度的,只会用完您存储的字符的空格。它不会像 char 或 nchar 那样保留存储空间

于 2013-06-11T21:18:31.177 回答
1

CASE如果数字小于 10000,您可以使用语句仅在零前添加:

client_id AS (
    case when [id] < 100000
    then right('00000'+convert([nvarchar](20), [id]), 5) 
    else convert([nvarchar](20), [id]) end) PERSISTED NOT NULL

nvarchar(20)在上面使用,但你应该使用任何合适的长度。

于 2013-06-11T21:24:11.020 回答
1
DECLARE @p TABLE (id INT)

INSERT INTO @p
select 1 UNION
SELECT 100 union
SELECT 100000 UNION
SELECT 1000000

SELECT ISNULL( REPLICATE('0', 5 - LEN(p.id)), '') + LTRIM(RTRIM(CAST(ISNULL(p.id, 0) AS NVARCHAR(MAX))))
FROM @p p

结果

(4 row(s) affected)

00001
00100
100000
1000000
于 2013-06-11T21:33:02.220 回答