最有效的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)