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を使用してこれをどのように実行しますか?
回答:
フィールドがすでに文字列の場合、これは機能します
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文字のサブストリングに切り捨てることにより、警告なしに失敗します。
SELECT REPLACE(STR('1',3),' ','0')
休憩:SELECT REPLACE(STR('1A',3),' ','0')
。これは、ユーザーが入力文字列に文字を入力し、そのケースをテストできなかったときに、私を焦らせただけです。
以下は、任意の幅に左パディングするためのより一般的な手法です。
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)
あらゆる状況に適したこの機能を使用してください。
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
DECLARE @NumStr VARCHAR(250) = '2016'; SELECT REPLICATE('0', 12 - LEN(@NumStr)) + @NumStr;
します:これは上記のSalarの最初の例を返します。Salarに感謝します。
DECLARE @NumStr VARCHAR(250) = '2016'; SELECT REPLICATE('0', 10 - LEN(@NumStr)) + @NumStr;
います。それは0000002016
次のようになります:上記の最初の例に戻ります。
共有しようと思った古いチケットを知っています。
私はこのコードが解決策を探しているのを見つけました。MSSQLのすべてのバージョンで機能するかどうかは不明ですが、MSSQL 2016を持っています。
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で左側をパディングします。@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
SQL Server 2008で日付をDATETIMEOFFSETに変換するためにタイムゾーンオフセットをタイムゾーン文字列に変換する方法を具体的に理解するためにここに来ました。総計ですが、必要です。
したがって、必要に応じて、負の数と正の数を処理し、先頭にゼロを付けて2つの文字にフォーマットする1つの方法が必要です。Anonsの答えは私に近づきましたが、負のタイムゾーン値は0-5
必須ではなく-05
したがって、彼の答えを少し調整すると、これはすべてのタイムゾーンの時間変換で機能します
DECLARE @n INT = 13 -- Works with -13, -5, 0, 5, etc
SELECT CASE
WHEN @n < 0 THEN '-' + REPLACE(STR(@n * -1 ,2),' ','0')
ELSE '+' + REPLACE(STR(@n,2),' ','0') END + ':00'
bigintと1つの先行ゼロまたはその他の単一の文字(最大20文字が返される)に対応し、入力数より短い結果の長さを可能にするこの関数を作成しました。
create FUNCTION fnPadNum (
@Num BIGINT --Number to be padded, @sLen BIGINT --Total length of results , @PadChar varchar(1))
RETURNS VARCHAR(20)
AS
--Pads bigint with leading 0's
--Sample: "select dbo.fnPadNum(201,5,'0')" returns "00201"
--Sample: "select dbo.fnPadNum(201,5,'*')" returns "**201"
--Sample: "select dbo.fnPadNum(201,5,' ')" returns " 201"
BEGIN
DECLARE @Results VARCHAR(20)
SELECT @Results = CASE
WHEN @sLen >= len(ISNULL(@Num, 0))
THEN replicate(@PadChar, @sLen - len(@Num)) + CAST(ISNULL(@Num, 0) AS VARCHAR)
ELSE CAST(ISNULL(@Num, 0) AS VARCHAR)
END
RETURN @Results
END
GO
--Usage:
SELECT dbo.fnPadNum(201, 5,'0')
SELECT dbo.fnPadNum(201, 5,'*')
SELECT dbo.fnPadNum(201, 5,' ')