と比較して:
REPLICATE(@padchar, @len - LEN(@str)) + @str
これは、どのように実行しても、SQL の非効率的な使用にすぎません。
おそらく何かのような
right('XXXXXXXXXXXX'+ rtrim(@str), @n)
ここで、X はパディング文字で、@n は結果の文字列の文字数です (固定長を扱っているため、パディングが必要であると仮定します)。
しかし、私が言ったように、データベースでこれを行うことは本当に避けるべきです。
何人かがこれのバージョンを提供しました:
right('XXXXXXXXXXXX'+ @str, @n)
nより長い場合、実際のデータが切り捨てられるため、注意してください。
@padstr = REPLICATE(@padchar, @len) -- this can be cached, done only once
SELECT RIGHT(@padstr + @str, @len)
おそらく、私はこれらの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
あなたが提供する方法が本当に非効率的であるかどうかはわかりませんが、長さやパディング文字を柔軟にする必要がない限り、別の方法は次のようになります (「 0" ~ 10 文字:
DECLARE
@pad_characters VARCHAR(10)
SET @pad_characters = '0000000000'
SELECT RIGHT(@pad_characters + @str, 10)
これは左にパディングする簡単な方法です:
REPLACE(STR(FACT_HEAD.FACT_NO, x, 0), ' ', y)
はパッドx
番号、y
はパッド文字です。
サンプル:
REPLACE(STR(FACT_HEAD.FACT_NO, 3, 0), ' ', 0)
vnRocks ソリューションが気に入りました。ここでは udf の形式です
create function PadLeft(
@String varchar(8000)
,@NumChars int
,@PadChar char(1) = ' ')
returns varchar(8000)
as
begin
return stuff(@String, 1, 0, replicate(@PadChar, @NumChars - len(@String)))
end
これが誰かに役立つことを願っています。
STUFF ( character_expression , start , length ,character_expression )
select stuff(@str, 1, 0, replicate('0', @n - len(@str)))
おそらくやり過ぎかもしれませんが、私はよくこの 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, '_')
select right(replicate(@padchar, @len) + @str, @len)
SQL Server 2005 以降では、これを行う CLR 関数を作成できました。
これが私の解決策です。任意の文字を埋め込むことができ、高速です。シンプルに行きました。ニーズに合わせて可変サイズを変更できます。
null の場合に何を返すかを処理するパラメータで更新: null の場合、null は null を返します
CREATE OR ALTER FUNCTION code.fnConvert_PadLeft(
@in_str nvarchar(1024),
@pad_length int,
@pad_char nchar(1) = ' ',
@rtn_null NVARCHAR(1024) = '')
RETURNS NVARCHAR(1024)
AS
BEGIN
DECLARE @rtn NCHAR(1024) = ' '
RETURN RIGHT(REPLACE(@rtn,' ',@pad_char)+ISNULL(@in_str,@rtn_null), @pad_length)
END
GO
CREATE OR ALTER FUNCTION code.fnConvert_PadRight(
@in_str nvarchar(1024),
@pad_length int,
@pad_char nchar(1) = ' ',
@rtn_null NVARCHAR(1024) = '')
RETURNS NVARCHAR(1024)
AS
BEGIN
DECLARE @rtn NCHAR(1024) = ' '
RETURN LEFT(ISNULL(@in_str,@rtn_null)+REPLACE(@rtn,' ',@pad_char), @pad_length)
END
GO
-- Example
SET STATISTICS time ON
SELECT code.fnConvert_PadLeft('88',10,'0',''),
code.fnConvert_PadLeft(null,10,'0',''),
code.fnConvert_PadLeft(null,10,'0',null),
code.fnConvert_PadRight('88',10,'0',''),
code.fnConvert_PadRight(null,10,'0',''),
code.fnConvert_PadRight(null,10,'0',NULL)
0000000088 0000000000 NULL 8800000000 0000000000 NULL
小数点以下第2位に四捨五入されているが、必要に応じてゼロが右に埋め込まれている数値を提供するには、次のようにします。
DECLARE @value = 20.1
SET @value = ROUND(@value,2) * 100
PRINT LEFT(CAST(@value AS VARCHAR(20)), LEN(@value)-2) + '.' + RIGHT(CAST(@value AS VARCHAR(20)),2)
誰かがよりきちんとした方法を考えることができるならば、それはありがたいです-上記は不器用に思えます。
注:この例では、SQL Serverを使用してレポートをHTML形式で電子メールで送信しているため、データを解析するための追加のツールを使用せずに情報を形式化したいと考えています。
これが私が通常varcharをパディングする方法です
WHILE Len(@String) < 8
BEGIN
SELECT @String = '0' + @String
END