Sun*_*nil 352 t-sql sql-server
在SQL Server 2008 R2中首次创建时,我有一个最多3个字符的字符串.
我想用前导零填充它,所以如果它的原始值是'1'那么新值将是'001'.或者,如果其原始值为"23",则新值为"023".或者,如果其原始值为"124",则新值与原始值相同.
我正在使用SQL Server 2008 R2.我如何使用T-SQL执行此操作?
Hog*_*gan 626
如果该字段已经是字符串,这将起作用
SELECT RIGHT('000'+ISNULL(field,''),3)
Run Code Online (Sandbox Code Playgroud)
如果你想让空值显示为'000'
它可能是一个整数 - 那么你会想要的
SELECT RIGHT('000'+CAST(field AS VARCHAR(3)),3)
Run Code Online (Sandbox Code Playgroud)
根据问题的要求,这个答案只有在长度<= 3时才有效,如果你想要更大的东西,你需要更改字符串常量,将两个整数常量更改为所需的宽度.例如
'0000' and VARCHAR(4)),4
Géz*_*éza 124
虽然问题出在SQL Server 2008 R2上,但是如果有人正在使用2012及更高版本阅读此版本,那么通过使用FORMAT会变得更加容易.
您可以传递标准数字格式字符串或自定义数字格式字符串作为格式参数(感谢Vadim Ovchinnikov提供此提示).
对于这个问题,例如像
DECLARE @myInt INT = 1;
-- One way using a standard numeric format string
PRINT FORMAT(@myInt,'D3');
-- Other way using a custom numeric format string
PRINT FORMAT(@myInt,'00#');
Run Code Online (Sandbox Code Playgroud)
输出
001
001
Run Code Online (Sandbox Code Playgroud)
Ano*_*non 105
安全方法:
SELECT REPLACE(STR(n,3),' ','0')
Run Code Online (Sandbox Code Playgroud)
这样做的好处是返回'***'n <0或n> 999 的字符串,这是一个很好的,明显的输入越界指示.此处列出的其他方法将通过将输入截断为3个字符的子字符串而无声地失败.
Nic*_*rey 30
这是一种更为通用的左填充到任何所需宽度的技术:
declare @x int = 123 -- value to be padded
declare @width int = 25 -- desired width
declare @pad char(1) = '0' -- pad character
select right_justified = replicate(
@pad ,
@width-len(convert(varchar(100),@x))
)
+ convert(varchar(100),@x)
Run Code Online (Sandbox Code Playgroud)
但是,如果您正在处理负值,并使用前导零填充,则此方法或其他建议的技术都不起作用.你会得到这样的东西:
00-123
Run Code Online (Sandbox Code Playgroud)
[可能不是你想要的]
那么......你将不得不跳过一些额外的箍这里有一种方法可以正确地格式化负数:
declare @x float = -1.234
declare @width int = 20
declare @pad char(1) = '0'
select right_justified = stuff(
convert(varchar(99),@x) , -- source string (converted from numeric value)
case when @x < 0 then 2 else 1 end , -- insert position
0 , -- count of characters to remove from source string
replicate(@pad,@width-len(convert(varchar(99),@x)) ) -- text to be inserted
)
Run Code Online (Sandbox Code Playgroud)
应该注意,convert()调用应该指定[n]varchar足够的长度来保持转换结果的截断.
jah*_*ahu 28
以下是我在SQL Server Express 2012中使用的Hogan答案的变体:
SELECT RIGHT(CONCAT('000', field), 3)
Run Code Online (Sandbox Code Playgroud)
我不是担心该字段是否为字符串,CONCAT而是因为它无论如何都会输出一个字符串.此外,如果字段可以是a NULL,则ISNULL可能需要使用以避免函数获得NULL结果.
SELECT RIGHT(CONCAT('000', ISNULL(field,'')), 3)
Run Code Online (Sandbox Code Playgroud)
小智 20
我总是发现以下方法非常有用.
REPLICATE('0', 5 - LEN(Job.Number)) + CAST(Job.Number AS varchar) as 'NumberFull'
Run Code Online (Sandbox Code Playgroud)
Sal*_*lar 13
使用适合各种情况的此功能.
CREATE FUNCTION dbo.fnNumPadLeft (@input INT, @pad tinyint)
RETURNS VARCHAR(250)
AS BEGIN
DECLARE @NumStr VARCHAR(250)
SET @NumStr = LTRIM(@input)
IF(@pad > LEN(@NumStr))
SET @NumStr = REPLICATE('0', @Pad - LEN(@NumStr)) + @NumStr;
RETURN @NumStr;
END
Run Code Online (Sandbox Code Playgroud)
样本输出
SELECT [dbo].[fnNumPadLeft] (2016,10) -- returns 0000002016
SELECT [dbo].[fnNumPadLeft] (2016,5) -- returns 02016
SELECT [dbo].[fnNumPadLeft] (2016,2) -- returns 2016
SELECT [dbo].[fnNumPadLeft] (2016,0) -- returns 2016
Run Code Online (Sandbox Code Playgroud)
小智 7
尝试使用固定长度。
select right('000000'+'123',5)
select REPLICATE('0', 5 - LEN(123)) + '123'
Run Code Online (Sandbox Code Playgroud)
对于那些想要更新现有数据的人来说,查询是:
update SomeEventTable set eventTime=RIGHT('00000'+ISNULL(eventTime, ''),5)
Run Code Online (Sandbox Code Playgroud)
小智 5
我知道这是一张旧票,但我只是想分享一下:
我发现这段代码提供了解决方案。不确定它是否适用于所有版本的 MSSQL;我有 MSSQL 2016。
declare @value as nvarchar(50) = 23
select REPLACE(STR(CAST(@value AS INT) + 1,4), SPACE(1), '0') as Leadingzero
Run Code Online (Sandbox Code Playgroud)
这将返回“0023”。
STR函数中的4是总长度,包括值。例如,4、23 和 123 在 STR 中都有 4,并且将添加正确数量的零。您可以增加或减少它。无需获取 23 的长度。
编辑:我看到它与@Anon 的帖子相同。
| 归档时间: |
|
| 查看次数: |
736293 次 |
| 最近记录: |