502

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

元の値が「1」だった場合、新しい値は「001」になります。または、元の値が「23」だった場合、新しい値は「023」になります。または、元の値が「124」の場合、新しい値は元の値と同じです。

SQL Server 2008 R2 を使用しています。T-SQLを使用してこれを行うにはどうすればよいですか?

4

17 に答える 17

182

質問は 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
于 2016-05-04T12:35:44.743 に答える
162

安全な方法:

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

これには、n < 0 または n > 999 の文字列を返すという利点があります'***'。これは、範囲外の入力を明確に示します。ここにリストされている他のメソッドは、入力を 3 文字の部分文字列に切り詰めることにより、暗黙のうちに失敗します。

于 2015-04-17T21:37:47.293 に答える
41

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

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

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

SELECT RIGHT(CONCAT('000', ISNULL(field,'')), 3)
于 2015-03-27T16:46:50.123 に答える
33

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

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

于 2014-07-10T18:23:39.960 に答える
18

あらゆるシチュエーションに合わせた機能をご利用ください。

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 
于 2016-05-08T05:47:22.210 に答える
4

整数の場合、int から varchar への暗黙的な変換を使用できます。

SELECT RIGHT(1000 + field, 3)
于 2014-04-25T08:13:32.787 に答える
2

固定サイズのvarchar(または文字列)出力が必要な場合、入力として整数列で同様の問題が発生しました。たとえば、1 を '01' に、12 を '12' にします。このコードは機能します:

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

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

于 2015-10-21T20:42:36.870 に答える