T-SQLのPadLeft関数


113

次の表Aがあります。

id
----
1
2
12
123
1234

id値をゼロで左詰めする必要があります:

id
----
0001
0002
0012
0123
1234

どうすればこれを達成できますか?

回答:


197

これはあなたが探しているものかもしれません:

SELECT padded_id = REPLACE(STR(id, 4), SPACE(1), '0') 

FROM tableA

または

SELECT REPLACE(STR(id, 4), SPACE(1), '0') AS [padded_id]

FROM tableA

2番目の例では構文をテストしていません。それが100%機能するかどうかはわかりませんが、多少の調整が必要になる場合がありますが、目的の出力を取得する方法の一般的な考え方を伝えています。

編集

コメントに記載されている懸念事項に対処するには...

@ pkr298-はいSTRは数値でのみ機能します... OPのフィールドはIDです...したがって、数値のみです。

@Desolator-もちろん、これは機能しません...最初のパラメーターは6文字です。次のようなことができます:

SELECT REPLACE(STR(id,
(SELECT LEN(MAX(id)) + 4 FROM tableA)), SPACE(1), '0') AS [padded_id] FROM tableA

これは理論的にはゴールポストを移動するはずです...数値が大きくなると、常に機能するはずです... 1か123456789かに関係なく...

したがって、最大値が123456の場合... 0000123456が表示され、最小値が1の場合、0000000001が表示されます


4
STR()は数値(または文字列フィールドの数値)でのみ機能します。このコードは、数値があると想定しているが、レコードの1つに不正な(非数値)データがあるvarcharフィールドで使用すると壊れます。この場合、RIGHT()関数は中断しません。
pkr298 2013

1
数が大きい長さの場合はSTR()関数は動作しません(例えば、STR(123456, 4)戻ります****

2
@Desolator追加したシナリオを容易にするために、応答と修正を追加しました。
Patrick

66

SQL Serverは、バージョン2012以降、FORMAT関数をサポートするようになりました。

SELECT FORMAT(id, '0000') FROM TableA

トリックを行います。

IDまたは列が内にありvarchar、最初に変換する数値を表す場合:

SELECT FORMAT(CONVERT(INT,id), '0000') FROM TableA

滑らかでシンプル、ありがとう!元の質問の日付を考えると、これが正式な回答になるはずです;)
David Gunderson

1
idが文字列の場合、最初に整数に変換できます
-select

申し訳ありませんが、この方法は本当に遅いため、私は反対票を投じます。受け入れられた答えは瞬時でしたが、90行以上を実行するには4秒かかりました。これは非常に大きな欠点であり、FORMATは最大1つまたは2つのレコードでのみ使用する必要があります。それ以外の場合は、パフォーマンスが非常に低いため、役に立ちません。
Shadow WizardはEar For You

@ShadowWizard数千行のFORMATを使用して瞬間的なパフォーマンスを確認しています。
JohnnyHK

@JohnnyHKたぶん、テーブルのデザインや他のデータベースの癖があるかもしれませんが、それでも...私にとっては、他の方法が速かったのに本当に遅いのです。
シャドウウィザードはあなたのための耳です


43

古い投稿ですが、これは誰かを助けるかもしれません:

空白以外の4文字で終わるまで完了するには:

SELECT RIGHT ('0000'+COLUMNNAME, 4) FROM TABLENAME;

10まで完了するには:

SELECT RIGHT ('0000000000'+COLUMNNAME, 10) FROM TABLENAME;

列がnumericの場合は、まず次のコードでvarcharに変換します。

Select RIGHT('0000'+Convert(nvarchar(20), COLUMNNAME), 4)
From TABLENAME

数値フィールドで10まで完了するには:

SELECT RIGHT ('0000000000'+Convert(nvarchar(20), COLUMNNAME), 10) FROM TABLENAME;

1
@ SilverM-A、とにかく無視されるため、数値の前に0を追加するユーティリティはありません(0003は結局3です)。おそらくあなたが達成したいことは、その数値を文字列(varchar)にキャストしてから、上記のステートメントを使用することです。
Marcelo Myara 2015

1
@ SilverM-A、その場合は、次のような "CAST"コマンドを使用してキャストします。SELECT RIGHT( '0000000000' + CAST(COLUMNNAME AS VARCHAR)、10)FROM TABLENAME; それですか?
Marcelo Myara 2015

@MarceloMyaraこれは単なるコメントではなく、回答の一部になるはずです。今自分で追加しました。
シャドウウィザードは、あなたのための耳です

注:これは最も効率的な答えであり、非常に遅くなる可能性のある豪華な関数はありません。したがって、私はそれに追加の賞金を与えました。
Shadow WizardはEar For You

12

これを試して:

SELECT RIGHT(REPLICATE('0',4)+CAST(Id AS VARCHAR(4)),4) FROM [Table A]


5

これは文字列、整数、数値で機能します。

SELECT CONCAT(REPLICATE('0', 4 - LEN(id)), id)

4希望の長さはどこですか。4桁を超える数値に対して機能し、値に空の文字列を返しNULLます。


3

まだ興味がある場合は、DATABASE.GUIDE:SQL Serverの左パディング– 3 LPAD()と同等のこの記事を見つけました。

つまり、その記事で言及されている3つの方法があります。
id = 12で、0012として表示する必要があるとします。

方法1 – RIGHT()関数を
使用する最初の方法は、RIGHT()関数を使用して、先行ゼロを追加した後、文字列の右端の部分のみを返します。

SELECT RIGHT('00' + '12', 4);

結果:
0012

方法2 – RIGHT()とREPLICATE()の組み合わせを使用する
この方法は前の方法とほとんど同じですが、唯一の違いは、3つのゼロをREPLICATE()関数で置き換えるだけです。

SELECT RIGHT(REPLICATE('0', 2) + '12', 4);

結果:
0012

方法3 – REPLACE()とSTR()の組み合わせを使用する
この方法は、前の方法とはまったく異なる角度から来ています。

SELECT REPLACE(STR('12', 4),' ','0');

結果:
0012

記事をチェックしてください。例を使った詳細な分析があります。


2

これは、値を埋め込む必要があるときに通常使用するものです。

SET @PaddedValue = REPLICATE('0', @Length - LEN(@OrigValue)) + CAST(@OrigValue as VARCHAR)

1

私はこれをSQLサーバーの関数で必要とし、パトリックの答えを少し調整しました。

declare @dossierId int = 123
declare @padded_id varchar(7)


set @padded_id = REPLACE(
              SPACE(7 - LEN(@dossierId)) + convert(varchar(7), @dossierId), 
              SPACE(1),  
              '0') 

SELECT @dossierId as '@dossierId'
      ,SPACE(LEN(@dossierId)) + convert(varchar(7)
      ,@dossierId) as withSpaces
      ,@padded_id as '@padded_id'

1

関数の作成:

    Create FUNCTION [dbo].[PadLeft]
      (
        @Text NVARCHAR(MAX) ,
        @Replace NVARCHAR(MAX) ,
        @Len INT
      )
RETURNS NVARCHAR(MAX)
AS
    BEGIN 


        DECLARE @var NVARCHAR(MAX) 

        SELECT @var = ISNULL(LTRIM(RTRIM(@Text)) , '')


        RETURN   RIGHT(REPLICATE(@Replace,@Len)+ @var, @Len)


    END

例:

Select dbo.PadLeft('123456','0',8)

標準についてのポイントですが、IsNullチェックを気にしません。値がnullの場合、組み込み関数の標準の動作であるため、関数はその値に対してnullを返す必要があります。すべてをnull以外の値に変換すると、呼び出し元は、本来想定されている可能性のあるnull論理演算を使用できなくなります。。私のテーブルの多くの手段が、「指定されていない」とデフォルト値が使用されるべきで(ヌルSELECT @var = LTRIM(RTRIM(@Text))
クリス・シャラー

1

私は関数を作成しました:

CREATE FUNCTION [dbo].[fnPadLeft](@int int, @Length tinyint)
RETURNS varchar(255) 
AS 
BEGIN
    DECLARE @strInt varchar(255)

    SET @strInt = CAST(@int as varchar(255))
    RETURN (REPLICATE('0', (@Length - LEN(@strInt))) + @strInt);
END;

使用:select dbo.fnPadLeft(123、10)

戻り値:0000000123


0

必要に応じてODBCにかなり準拠したものは次のとおりです。

select ifnull(repeat('0', 5 - (floor(log10(FIELD_NAME)) + 1)), '')
        + cast (FIELD as varchar(10))
  from TABLE_NAME

これは、10を底とする数値の桁数が、ログの積分コンポーネントによって検出できるという事実に基づいています。これから、希望するパディング幅からそれを差し引くことができます。Repeatはnull1未満の値に戻るため、必要ifnullです。


0

私の解決策は効率的ではありませんが、値(銀行小切手番号と電信送金の参照番号)がvarcharとして格納され、一部のエントリに英数字の値が含まれていて、長さが6文字未満の場合はパディングする必要があった状況で役に立ちました。

誰かが同じ状況に遭遇した場合に共有すると考えました

declare @minlen int = 6
declare @str varchar(20)

set @str = '123'
select case when len(@str) < @minlen then REPLICATE('0',@minlen-len(@str))+@str else @str end
--Ans: 000123

set @str = '1234'
select case when len(@str) < @minlen then REPLICATE('0',@minlen-len(@str))+@str else @str end
--Ans: 001234

set @str = '123456'
select case when len(@str) < @minlen then REPLICATE('0',@minlen-len(@str))+@str else @str end
--Ans: 123456

set @str = '123456789'
select case when len(@str) < @minlen then REPLICATE('0',@minlen-len(@str))+@str else @str end
--Ans: 123456789

set @str = '123456789'
select case when len(@str) < @minlen then REPLICATE('0',@minlen-len(@str))+@str else @str end
--Ans: 123456789


set @str = 'NEFT 123456789'
select case when len(@str) < @minlen then REPLICATE('0',@minlen-len(@str))+@str else @str end
--Ans: NEFT 123456789

0

簡単な例は

    DECLARE @number INTEGER
    DECLARE @length INTEGER
    DECLARE @char   NVARCHAR(10)
    SET @number = 1
    SET @length = 5
    SET @char = '0'

    SELECT FORMAT(@number, replicate(@char, @length))

0

これを行う関数を作成しました。ここで、必要な出力文字長を指定できます。

CREATE FUNCTION [dbo].[udfLeadingZero]
(
        @String VARCHAR(MAX)
,       @Len INT
)
RETURNS VARCHAR(MAX)
BEGIN
    SET @String = RIGHT(REPLICATE('0',@Len)+@String,@Len)
RETURN @String
END
GO

結果の例


-5

より効率的な方法は次のとおりです。

Select id, LEN(id)
From TableA
Order by 2,1 

The result :
id
----
1
2
12
123
1234

6
これは、ゼロによるパディングに関するOPの質問にどのように答えますか?
Filburt
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.