我的表中有一个计算列,它将零添加到另一列的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
谢谢你,我为这个令人困惑的头衔道歉。
答案 0 :(得分:1)
然后使用CASE
:
SELECT client_id = CASE
WHEN id > 99999 THEN id
ELSE RIGHT('00000' + CONVERT(VARCHAR, id), 5)
END
FROM dbo.table1
请注意......
char
和nchar
是固定长度的,即使您没有用尽所有空间,也会为您指定的字符数保留存储空间。
但
varchar
和nvarchar
是可变长度,它只会占用您存储的字符的空格。它不会保留像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