TSQL计算列:前置为零直到限制

时间:2013-06-11 21:09:44

标签: sql-server tsql calculated-columns

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

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

基本上,它会将id转换为NVARCHAR(5),并以00000为前缀,然后抓取最右边的五个字符。这很好用,但如果我的身份证号码大于99999(因此是6位数字),它将会删除第一个数字。这是预期但不需要的。

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

示例:

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

谢谢你,我为这个令人困惑的头衔道歉。

3 个答案:

答案 0 :(得分:1)

然后使用CASE

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

Demo

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

答案 1 :(得分:1)

如果数字小于10000,您可以使用CASE语句仅预先挂起零:

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),但你应该使用适当的长度。

答案 2 :(得分: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