web-dev-qa-db-ja.com

SQL Server 2008では3文字の長さになるように、先頭にゼロを付けて文字列を埋めます。

SQL Server 2008 R2で最初に作成されたときには、最大3文字の長さの文字列があります。

先行ゼロで埋めたいので、元の値が「1」の場合、新しい値は「001」になります。元の値が「23」の場合、新しい値は「023」です。元の値が '124'の場合、新しい値は元の値と同じです。

SQL Server 2008 R2を使用しています。 T-SQLを使用してこれをどのようにしますか。

315
Sunil

フィールドがすでに文字列の場合、これは機能します。

 SELECT RIGHT('000'+ISNULL(field,''),3)

Nullを '000'として表示したい場合

それは整数かもしれません - そしてあなたは望むでしょう

 SELECT RIGHT('000'+CAST(field AS VARCHAR(3)),3)

質問で要求されるように、この答えは長さ<= 3の場合にのみうまくいきます、もっと大きいものが欲しいならあなたは文字列定数と2つの整数定数を必要な幅に変える必要があります。例:'0000' and VARCHAR(4)),4

560
Hogan

問題は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#');

アウトプット

001
001
105
Géza

安全な方法:

SELECT REPLACE(STR(n,3),' ','0')

これには、n <0またはn> 999の文字列'***'が返されるという利点があります。これは、範囲外の入力を示す、わかりやすい指標です。ここにリストされている他のメソッドは、入力を3文字のサブストリングに切り捨てることによって黙って失敗します。

83
Anon

これは、任意の幅に左パディングするためのより一般的な手法です。

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)

ただし、負の値を扱い、先行ゼロを埋め込む場合は、これも他の推奨される手法も機能しません。あなたはこのように見える何かを得るでしょう:

00-123

[おそらくあなたが望んでいたものではない]

それで…あなたはいくつかの追加のフープを飛び越えなければならないでしょうこれは適切に負の数をフォーマットする1つのアプローチです:

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を指定する必要があることに注意してください。

29
Nicholas Carey

これは私がSQL Server Express 2012で使用するHoganの回答の変形です。

SELECT RIGHT(CONCAT('000', field), 3)

フィールドが文字列であるかどうかを心配する代わりに、単に文字列を出力するので、それをCONCATにするだけです。さらに、フィールドがNULLになる可能性がある場合は、関数がISNULLの結果を取得しないようにするためにNULLを使用する必要があります。

SELECT RIGHT(CONCAT('000', ISNULL(field,'')), 3)
24
jahu

私は以下の方法が非常に役に立つことを常に見つけました。

REPLICATE('0', 5 - LEN(Job.Number)) + CAST(Job.Number AS varchar) as 'NumberFull'
16
Bill

あらゆる状況に適したこの機能を使用してください。

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

出力例

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 
12
Salar

既存のデータを更新したい人のために、ここにクエリがあります。

update SomeEventTable set eventTime=RIGHT('00000'+ISNULL(eventTime, ''),5)
5
Alan B. Dee

整数の場合は、暗黙的にint型からvarchar型に変換できます。

SELECT RIGHT(1000 + field, 3)
3
Konstantin

私はちょうどそれを共有しようと思ったその古いチケットを知っています。

私はこのコードが解決策を探しているのを見つけました。それが私がMSSQL 2016を持っているMSSQLのすべてのバージョンで動作するかどうかわからない。

declare @value as nvarchar(50) = 23
select REPLACE(STR(CAST(@value AS INT) + 1,4), SPACE(1), '0') as Leadingzero

"0023"を返します。STR関数の4は、値を含む全長です。例4、23、および123はすべてSTRに4があり、正しい量のゼロが追加されます。増減できます。 23の長さを取得する必要はありません。

編集:@Anonの投稿と同じです。

2
Niel Buys

固定サイズのvarchar(または文字列)出力が必要な場合は、整数列を入力として同様の問題がありました。例えば、1から '01'、12から '12'などです。このコードは動作します:

SELECT RIGHT(CONCAT('00',field::text),2)

入力がvarcharの列でもある場合は、キャスト部分を避けることができます。

1
user3183867

私が特定の長さ(9)までの要件を持っていたのでこれを書いた。入力にパディングが必要な場合にのみ、@パターンを使用して左にパディングします。常に@patternで定義された長さを返すべきです。

declare @charInput as char(50) = 'input'

--always handle NULL :)
set @charInput = isnull(@charInput,'')

declare @actualLength as int = len(@charInput)

declare @pattern as char(50) = '123456789'
declare @prefLength as int = len(@pattern)

if @prefLength > @actualLength
    select Left(Left(@pattern, @prefLength-@actualLength) + @charInput, @prefLength)
else
    select @charInput

1234inputを返します。

1
nicky

シンプルです

のような:

DECLARE @DUENO BIGINT
SET @DUENO=5

SELECT 'ND'+STUFF('000000',6-LEN(RTRIM(@DueNo))+1,LEN(RTRIM(@DueNo)),RTRIM(@DueNo)) DUENO
1
DEBASIS PAUL

固定長でこれを試してください。

select right('000000'+'123',5)

select REPLICATE('0', 5 - LEN(123)) + '123'
0
Dr.Stark

より動的なアプローチのためにこれを試してください。

declare @val varchar(5)
declare @maxSpaces int
set @maxSpaces = 3
set @val = '3'
select concat(REPLICATE('0',@maxSpaces-len(@val)),@val)
0
ncastillo