次の表Aがあります。
id
----
1
2
12
123
1234
id
値をゼロで左詰めする必要があります。
id
----
0001
0002
0012
0123
1234
どうすればこれを達成できますか?
私はこれがあなたの探しているものかもしれないと信じています:
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が表示されます。
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
SQL Serverは、バージョン2012以降の FORMAT 関数をサポートするようになりました。
SELECT FORMAT(id, '0000') FROM TableA
トリックを行います。
IDまたは列がvarchar
にあり、最初に変換する数値を表す場合:
SELECT FORMAT(CONVERT(INT,id), '0000') FROM TableA
古い投稿ですが、これは誰かを助けるかもしれません:
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;
これを試して:
SELECT RIGHT(REPLICATE('0',4)+CAST(Id AS VARCHAR(4)),4) FROM [Table A]
-これらを調べてください。
select FORMAT(1, 'd4');
select FORMAT(2, 'd4');
select FORMAT(12, 'd4');
select FORMAT(123, 'd4');
select FORMAT(1234, 'd4');
-これらがあなたのお役に立てば幸いです
これは、文字列、整数、および数値に対して機能します。
SELECT CONCAT(REPLICATE('0', 4 - LEN(id)), id)
4
が必要な長さです。 4桁を超える数値で機能し、NULL
値に空の文字列を返します。
これは、値を埋め込む必要があるときに通常使用するものです。
SET @PaddedValue = REPLICATE('0', @Length - LEN(@OrigValue)) + CAST(@OrigValue as VARCHAR)
関数を作成します。
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)
これを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'
関数を作成しました:
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
まだ興味がある人は、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
記事をチェックしてください。例による詳細な分析があります。
私の解決策は効率的ではありませんが、値(銀行小切手番号と電信送金参照番号)が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
簡単な例は
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))
必要に応じてかなりODBCに準拠するものは次のとおりです。
select ifnull(repeat('0', 5 - (floor(log10(FIELD_NAME)) + 1)), '')
+ cast (FIELD as varchar(10))
from TABLE_NAME
これは、10を底とする数値の桁数がそのログの整数成分によって検出できるという事実に基づいています。これから、目的のパディング幅からそれを差し引くことができます。繰り返しは、1未満の値に対してnull
を返すため、ifnull
が必要です。