我有一个最多3个字符长的字符串,当它第一次创建在SQL Server 2008 R2。
我想用前导零填充它,所以如果它的原始值是“1”,那么新值将是“001”。或者如果它的原始值是“23”,那么新的值是“023”。或者如果它的原始值为124,则新值与原始值相同。
我使用的是SQL Server 2008 R2。如何使用T-SQL做到这一点?
我有一个最多3个字符长的字符串,当它第一次创建在SQL Server 2008 R2。
我想用前导零填充它,所以如果它的原始值是“1”,那么新值将是“001”。或者如果它的原始值是“23”,那么新的值是“023”。或者如果它的原始值为124,则新值与原始值相同。
我使用的是SQL Server 2008 R2。如何使用T-SQL做到这一点?
当前回答
我创建了这个函数,它满足bigint和一个前导零或其他单个字符(最多返回20个字符),并允许结果长度小于输入数字的长度:
create FUNCTION fnPadNum (
@Num BIGINT --Number to be padded, @sLen BIGINT --Total length of results , @PadChar varchar(1))
RETURNS VARCHAR(20)
AS
--Pads bigint with leading 0's
--Sample: "select dbo.fnPadNum(201,5,'0')" returns "00201"
--Sample: "select dbo.fnPadNum(201,5,'*')" returns "**201"
--Sample: "select dbo.fnPadNum(201,5,' ')" returns " 201"
BEGIN
DECLARE @Results VARCHAR(20)
SELECT @Results = CASE
WHEN @sLen >= len(ISNULL(@Num, 0))
THEN replicate(@PadChar, @sLen - len(@Num)) + CAST(ISNULL(@Num, 0) AS VARCHAR)
ELSE CAST(ISNULL(@Num, 0) AS VARCHAR)
END
RETURN @Results
END
GO
--Usage:
SELECT dbo.fnPadNum(201, 5,'0')
SELECT dbo.fnPadNum(201, 5,'*')
SELECT dbo.fnPadNum(201, 5,' ')
其他回答
下面是一个更通用的左填充到任何所需宽度的技巧:
declare @x int = 123 -- value to be padded
declare @width int = 25 -- desired width
declare @pad char(1) = '0' -- pad character
select right_justified = COALESCE(replicate(
@pad ,
@width-len(convert(varchar(100),@x))
), '')
+ convert(varchar(100),@x)
但是,如果处理的是负值,并且填充前导为0,那么这种方法和其他建议的技术都不起作用。你会得到这样的结果:
00-123
[可能不是你想要的]
下面是一种正确格式化负数的方法:
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
)
应该注意,convert()调用应该指定一个[n]varchar,该varchar有足够的长度来保存经过截断的转换结果。
很简单
如:
DECLARE @DUENO BIGINT
SET @DUENO=5
SELECT 'ND'+STUFF('000000',6-LEN(RTRIM(@DueNo))+1,LEN(RTRIM(@DueNo)),RTRIM(@DueNo)) DUENO
当我需要固定大小的varchar(或字符串)输出时,我用整数列作为输入有类似的问题。例如,1到'01',12到'12'。这段代码工作:
SELECT RIGHT(CONCAT('00',field::text),2)
如果输入也是varchar的列,则可以避免强制转换部分。
对于那些想要更新现有数据的人,这里是查询:
update SomeEventTable set eventTime=RIGHT('00000'+ISNULL(eventTime, ''),5)
最后我决定用这个:
RIGHT(STUFF(ReceiptNum, 1, 0, replicate('0',10)),10)