web-dev-qa-db-ja.com

T-SQLのPadLeft関数

次の表Aがあります。

id
----
1
2
12
123
1234

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

id
----
0001
0002
0012
0123
1234

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

102
Gali

私はこれがあなたの探しているものかもしれないと信じています:

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が表示されます。

186
Patrick
declare @T table(id int)
insert into @T values
(1),
(2),
(12),
(123),
(1234)

select right('0000'+convert(varchar(4), id), 4)
from @T

結果

----
0001
0002
0012
0123
1234
57
Mikael Eriksson

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

SELECT FORMAT(id, '0000') FROM TableA

トリックを行います。

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

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

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

4つの非空白文字になるまで完了するには:

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

10まで完了するには:

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

列が数値の場合、次のコードで最初にvarcharに変換します:

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

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

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

これを試して:

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

-これらを調べてください。

select FORMAT(1, 'd4');
select FORMAT(2, 'd4');
select FORMAT(12, 'd4');
select FORMAT(123, 'd4');
select FORMAT(1234, 'd4');

-これらがあなたのお役に立てば幸いです

8

これは、文字列、整数、および数値に対して機能します。

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

4が必要な長さです。 4桁を超える数値で機能し、NULL値に空の文字列を返します。

5
Piotr Nawrot

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

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

関数を作成します。

    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)
1
mehrdad

これをSQLサーバーの関数で必要とし、Patrickの答えを少し調整しました。

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
Bob Lokerse

関数を作成しました:

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

1
Anne Lord

まだ興味がある人は、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

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

1
kfed

私の解決策は効率的ではありませんが、値(銀行小切手番号と電信送金参照番号)が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
Tejasvi Hegde

簡単な例は

    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

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

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

これは、10を底とする数値の桁数がそのログの整数成分によって検出できるという事実に基づいています。これから、目的のパディング幅からそれを差し引くことができます。繰り返しは、1未満の値に対してnullを返すため、ifnullが必要です。

0
Brett Ryan