SQL Server 2008 R2で最初に作成されたときには、最大3文字の長さの文字列があります。
先行ゼロで埋めたいので、元の値が「1」の場合、新しい値は「001」になります。元の値が「23」の場合、新しい値は「023」です。元の値が '124'の場合、新しい値は元の値と同じです。
SQL Server 2008 R2を使用しています。 T-SQLを使用してこれをどのようにしますか。
フィールドがすでに文字列の場合、これは機能します。
SELECT RIGHT('000'+ISNULL(field,''),3)
Nullを '000'として表示したい場合
それは整数かもしれません - そしてあなたは望むでしょう
SELECT RIGHT('000'+CAST(field AS VARCHAR(3)),3)
質問で要求されるように、この答えは長さ<= 3の場合にのみうまくいきます、もっと大きいものが欲しいならあなたは文字列定数と2つの整数定数を必要な幅に変える必要があります。例:
'0000' and VARCHAR(4)),4
問題は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
安全な方法:
SELECT REPLACE(STR(n,3),' ','0')
これには、n <0またはn> 999の文字列'***'
が返されるという利点があります。これは、範囲外の入力を示す、わかりやすい指標です。ここにリストされている他のメソッドは、入力を3文字のサブストリングに切り捨てることによって黙って失敗します。
これは、任意の幅に左パディングするためのより一般的な手法です。
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
を指定する必要があることに注意してください。
これは私がSQL Server Express 2012で使用するHoganの回答の変形です。
SELECT RIGHT(CONCAT('000', field), 3)
フィールドが文字列であるかどうかを心配する代わりに、単に文字列を出力するので、それをCONCAT
にするだけです。さらに、フィールドがNULL
になる可能性がある場合は、関数がISNULL
の結果を取得しないようにするためにNULL
を使用する必要があります。
SELECT RIGHT(CONCAT('000', ISNULL(field,'')), 3)
私は以下の方法が非常に役に立つことを常に見つけました。
REPLICATE('0', 5 - LEN(Job.Number)) + CAST(Job.Number AS varchar) as 'NumberFull'
あらゆる状況に適したこの機能を使用してください。
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
既存のデータを更新したい人のために、ここにクエリがあります。
update SomeEventTable set eventTime=RIGHT('00000'+ISNULL(eventTime, ''),5)
整数の場合は、暗黙的にint型からvarchar型に変換できます。
SELECT RIGHT(1000 + field, 3)
私はちょうどそれを共有しようと思ったその古いチケットを知っています。
私はこのコードが解決策を探しているのを見つけました。それが私が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の投稿と同じです。
固定サイズのvarchar(または文字列)出力が必要な場合は、整数列を入力として同様の問題がありました。例えば、1から '01'、12から '12'などです。このコードは動作します:
SELECT RIGHT(CONCAT('00',field::text),2)
入力がvarcharの列でもある場合は、キャスト部分を避けることができます。
私が特定の長さ(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を返します。
シンプルです
のような:
DECLARE @DUENO BIGINT
SET @DUENO=5
SELECT 'ND'+STUFF('000000',6-LEN(RTRIM(@DueNo))+1,LEN(RTRIM(@DueNo)),RTRIM(@DueNo)) DUENO
固定長でこれを試してください。
select right('000000'+'123',5)
select REPLICATE('0', 5 - LEN(123)) + '123'
より動的なアプローチのためにこれを試してください。
declare @val varchar(5)
declare @maxSpaces int
set @maxSpaces = 3
set @val = '3'
select concat(REPLICATE('0',@maxSpaces-len(@val)),@val)