SQL Serverで先行ゼロを埋め込んで数値をフォーマットする


119

SQL Server 2000によって10年近く使用された古いSQLテーブルがあります。

その中に、従業員のバッジ番号はchar(6)fromからまでの000001ように保存されてい999999ます。

現在、Webアプリケーションを作成していて、従業員のバッジ番号を保存する必要があります。

新しいテーブルでは、ショートカットを使用して古いテーブルをコピーできますが、intから1に値を格納するだけで、データ転送の向上、サイズの縮小などを望んでいます999999

C#では、int次を使用してバッジ番号の値をすばやくフォーマットできます

public static string GetBadgeString(int badgeNum) {
  return string.Format("{0:000000}", badgeNum);
  // alternate
  // return string.Format("{0:d6}", badgeNum);
}

この単純なSQLクエリを変更して、戻り値もフォーマットする方法を教えてください。

SELECT EmployeeID
FROM dbo.RequestItems
WHERE ID=0

EmployeeIDが7135の場合、このクエリはを返し007135ます。


先頭0のsはこのフィールドにとって重要なので、なぜそれをに変更するのINTですか?
Oded

2
SQL Server 2012のはなり最終的には持っているFORMATC#のような機能を:-)
marc_s

1
@おでん:int値が占めるスペースは大幅に少なくchar(6)、製造されるパーツごとにこれらのエントリが複数存在します。効率。
jp2code

問題が発生する前に最適化していますか?
2012年

4
見てみましょう。最大100万個のバッジ番号があり、(に従ってDATALENGTH())それぞれ2バイトを節約できると考えます。列がインデックスに含まれている可能性があるため、2MB以上を節約できる可能性があります。そして、他の列を追加すると、その2バイトは、行の長さを減らして行あたり4KBページを節約するのに十分な場合があります。これはモバイルプラットフォームでホストされる予定ですか、それとも非生産的な領域に注意を向けているのでしょうか。
HABO、2012年

回答:


172

数値6を、必要な全長に変更します。

SELECT REPLICATE('0',6-LEN(EmployeeId)) + EmployeeId

列がINTの場合、RTRIMを使用して暗黙的に列をVARCHARに変換できます。

SELECT REPLICATE('0',6-LEN(RTRIM(EmployeeId))) + RTRIM(EmployeeId)

そして、これらの0を削除して「実際の」数を戻すコード:

SELECT RIGHT(EmployeeId,(LEN(EmployeeId) - PATINDEX('%[^0]%',EmployeeId)) + 1)

1
+1あなたは私に0を削除する方法さえ示しました!これをテストしてみましょう。答えとしてマークします。
jp2code

ゼロを削除するためのコードは必要ありません。intに割り当てるか変換するだけで、自動的に削除されます。
神保

2
この中で渡された値が文字列であれば、あなたが渡された同じ値を出す整数を渡す場合にのみ、動作します。
Mordy

2
古いものですが、「+ EmployeeID」の代わりに「+ convert(varchar、EmployeeID)」を使用すると、intの問題を解決できます
クリシュナサルマ

3
EmployeeIdが6桁を超えてNULLの結果が発生しない限り、これは良い方法です。連絡先関数が答えです:SELECT CONCAT(REPLICATE( '0'、6-LEN(CONVERT(varchar、EmployeeId)))、EmployeeId)
Mahmoud Moravej

125

FORMAT関数を使用するだけです(SQL Server 2012以降で機能します)。

SELECT FORMAT(EmployeeID, '000000')
FROM dbo.RequestItems
WHERE ID=0 

リファレンス:http : //msdn.microsoft.com/en-us/library/hh213505.aspx


1
これは古い質問です-SQL Server 2012が出る前に。
jp2code 2014

19
それでも、このバブルが少し上に見えるようにしたいと思います。
Dave Haynes

4
誰かが疑問に思っている場合に備えて。Formatデータ型を保持するが、暗黙的にnvarchar型に変換されていません:select sql_variant_property(50, 'BaseType'), sql_variant_property(format(50, N'00000'), 'BaseType')
ラルフ

2
この方法が最も簡単で、IMHOが最良のソリューションです。
Robert Lujo 2016年

大規模なデータセットに使用する場合は、この関数に注意してください
amd

33

この方法で手順を変更できます

SELECT Right('000000' + CONVERT(NVARCHAR, EmployeeID), 6) AS EmpIDText, 
       EmployeeID
FROM dbo.RequestItems 
WHERE ID=0 

ただし、これはあなたEmployeeIDが数値であることを想定しており、このコードは結果を文字列に変更します。元の数値をもう一度追加することをお勧めします

編集もちろん、上記の質問を注意深く読んでいません。フィールドはchar(6)soなので、EmployeeIDは数値ではありません。この答え自体はまだ価値がありますが、上記の質問に対する正しい答えではありません。


これは私が考える最もクリーンな方法です。ありがとう
iheartcsharp

それは'000000'本当に必要なのでしょうか?'0'また、正常に動作しています。0 ..を1つだけ使用しても安全ですか?
shashwat 2013年

1
その結果、OPは6文字の長さの文字列を要求しました。具体的には、EmployeeIDが7135の場合、このクエリは007135を返します。「0」を1つだけ使用すると、は返され07135ません007135。全体のアイデアは、すべて0の文字列が変換されたEmployeedIDで構成される6文字の文字列に連結し、右端から開始して6文字を取ることです。上記の方法でIDがどのような長さであっても、6文字の長さに到達するために必要なゼロ文字の数だけの文字列が常に返されます
Steve

には少なくとも1つの数字が含まれる'00000'ため、ゼロは5つになる可能性がありますEmployeeID。しかし、REPLICATE()他の回答と同様に、関数はより適合しているようです
nosklo

26

intを変換する必要がありませんでしたが、これははるかに簡単に思えます。文字列変換と単純な追加が1つしかないため、パフォーマンスが向上する可能性もあります。

RIGHT(1000000 + EmployeeId、6)を選択します...

「1000000」に少なくとも必要なサイズと同じ数のゼロがあることを確認してください。


11

私はすべて1つの場所に投稿しています。4つの先行ゼロを埋め込むことができます:)

declare @number int =  1;
print right('0000' + cast(@number as varchar(4)) , 4)
print right('0000' + convert(varchar(4), @number) , 4)
print right(replicate('0',4) + convert(varchar(4), @number) , 4)
print  cast(replace(str(@number,4),' ','0')as char(4))
print format(@number,'0000')

これは必要なすべてのオプションをカバーしています。ありがとうございました。
kyurthich 2017

6

もう1つの方法は、完全を期すためです。

DECLARE @empNumber INT = 7123
SELECT STUFF('000000', 6-LEN(@empNumber)+1, LEN(@empNumber), @empNumber)

または、クエリごとに

SELECT STUFF('000000', 6-LEN(EmployeeID)+1, LEN(EmployeeID), EmployeeID) 
         AS EmployeeCode
FROM dbo.RequestItems
WHERE ID=0

@ jp2code -あなたがする必要がStackOverflowのが何であるかをよく読んで、その共同のwikiのように編集した- -そのないあなたの質問にすぐにあなたがそれを投稿したとして!一般的に編集されているものは、事前の感謝や不適切な文法/大文字化のような過度の「ふわふわ」です。
Jamiec 2013年


4

変数で置き換えるスコープを取得して与えることができる限りクリーンです。

Select RIGHT(REPLICATE('0',6) + EmployeeID, 6) from dbo.RequestItems
WHERE ID=0

場合EmployeeID列は次のように定義されint、次いで+演算子は加算ではなく連結ようにゼロが失われるように処理されるであろう。を使用convertすると、この問題を回避できます。

'000000'の入力を避けるためにREPLICATE( '0'、6)を呼び出すのは無駄です;-)
Mladen Mihajlovic

3
SELECT replicate('0', 6 - len(employeeID)) + convert(varchar, employeeID) as employeeID
FROM dbo.RequestItems 
WHERE ID=0

2
SELECT 
    cast(replace(str(EmployeeID,6),' ','0')as char(6)) 
FROM dbo.RequestItems
WHERE ID=0

おっと。実際、7135.0私がそれを与えたとき、これは私に与えました7135
jp2code

1

このソリューションは、すべてのSQLバージョンで、先頭にゼロが付いた符号付き/負の数に対して機能します。

DECLARE
    @n money = -3,
    @length tinyint = 15,
    @decimals tinyint = 0

SELECT REPLICATE('-', CHARINDEX('-', @n, 1)) + REPLACE(REPLACE(str(@n, @length, @decimals), '-', ''), ' ', '0')

1

最も単純なのは常に最高です:

Select EmployeeID*1 as EmployeeID 

-1

私のバージョンのSQLでは、REPLICATEを使用できません。だから私はこれをしました:

SELECT 
    CONCAT(REPEAT('0', 6-LENGTH(emplyeeID)), emplyeeID) AS emplyeeID 
FROM 
    dbo.RequestItems`
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.