SQL Server 2008 R2 で最初に作成されたとき、最大 3 文字の長さの文字列があります。
元の値が「1」だった場合、新しい値は「001」になります。または、元の値が「23」だった場合、新しい値は「023」になります。または、元の値が「124」の場合、新しい値は元の値と同じです。
SQL Server 2008 R2 を使用しています。T-SQLを使用してこれを行うにはどうすればよいですか?
SQL Server 2008 R2 で最初に作成されたとき、最大 3 文字の長さの文字列があります。
元の値が「1」だった場合、新しい値は「001」になります。または、元の値が「23」だった場合、新しい値は「023」になります。または、元の値が「124」の場合、新しい値は元の値と同じです。
SQL Server 2008 R2 を使用しています。T-SQLを使用してこれを行うにはどうすればよいですか?
質問は SQL Server 2008 R2 に関するものでしたが、誰かがバージョン 2012 以降でこれを読んでいる場合、それ以降はFORMATを使用することではるかに簡単になりました。
標準の数値書式文字列またはカスタムの数値書式文字列を 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 文字の部分文字列に切り詰めることにより、暗黙のうちに失敗します。
これは、SQL Server Express 2012 で使用する Hogan の回答の変形です。
SELECT RIGHT(CONCAT('000', field), 3)
フィールドが文字列であるかどうかを心配する代わりに、CONCAT
とにかく文字列を出力するので、それだけです。さらに、フィールドが になる可能性がある場合は、関数が結果を取得するのを避けるためにNULL
を使用する必要がある場合があります。ISNULL
NULL
SELECT RIGHT(CONCAT('000', ISNULL(field,'')), 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
あらゆるシチュエーションに合わせた機能をご利用ください。
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
整数の場合、int から varchar への暗黙的な変換を使用できます。
SELECT RIGHT(1000 + field, 3)
固定サイズのvarchar(または文字列)出力が必要な場合、入力として整数列で同様の問題が発生しました。たとえば、1 を '01' に、12 を '12' にします。このコードは機能します:
SELECT RIGHT(CONCAT('00',field::text),2)
入力も varchar の列である場合は、キャスト部分を回避できます。