最有效的T-SQL方式将左侧的varchar填充到一定长度?
时间:2020-03-06 14:36:26 来源:igfitidea点击:
相比说:
REPLICATE(@padchar, @len - LEN(@str)) + @str
解决方案
无论我们怎么做,这都是对SQL的低效使用。
也许像
right('XXXXXXXXXXXX'+ rtrim(@str), @n)
其中X是填充字符,@n是结果字符串中的字符数(假设我们需要填充,因为我们要处理的是固定长度)。
但是正如我所说,我们应该避免在数据库中执行此操作。
我不确定我们提供的方法是否真的没有效率,但是可以选择一种替代方法,只要该方法不必在长度或者填充字符方面保持灵活性即可(假设我们想使用" 0"到10个字符:
DECLARE @pad_characters VARCHAR(10) SET @pad_characters = '0000000000' SELECT RIGHT(@pad_characters + @str, 10)
@padstr = REPLICATE(@padchar, @len) -- this can be cached, done only once SELECT RIGHT(@padstr + @str, @len)
select right(replicate(@padchar, @len) + @str, @len)
在SQL Server 2005和更高版本中,我们可以创建CLR函数来执行此操作。
可能是矫kill过正,我经常使用此UDF:
CREATE FUNCTION [dbo].[f_pad_before](@string VARCHAR(255), @desired_length INTEGER, @pad_character CHAR(1)) RETURNS VARCHAR(255) AS BEGIN -- Prefix the required number of spaces to bulk up the string and then replace the spaces with the desired character RETURN ltrim(rtrim( CASE WHEN LEN(@string) < @desired_length THEN REPLACE(SPACE(@desired_length - LEN(@string)), ' ', @pad_character) + @string ELSE @string END )) END
这样我们就可以执行以下操作:
select dbo.f_pad_before('aaa', 10, '_')
有几个人给出了这样的版本:
right('XXXXXXXXXXXX'+ @str, @n)
请注意这一点,因为如果长度大于n,它将截断实际数据。
这个怎么样:
replace((space(3 - len(MyField))
3是要填充的"零"的数量
也许过分杀了我让这些UDF左右移动
ALTER Function [dbo].[fsPadLeft](@var varchar(200),@padChar char(1)='0',@len int) returns varchar(300) as Begin return replicate(@PadChar,@len-Len(@var))+@var end
并向右
ALTER function [dbo].[fsPadRight](@var varchar(200),@padchar char(1)='0', @len int) returns varchar(201) as Begin --select @padChar=' ',@len=200,@var='hello' return @var+replicate(@PadChar,@len-Len(@var)) end
这是向左滑动的一种简单方法:
REPLACE(STR(FACT_HEAD.FACT_NO, x, 0), ' ', y)
其中" x"是填充编号,而" y"是填充字符。
样本:
REPLACE(STR(FACT_HEAD.FACT_NO, 3, 0), ' ', 0)