web-dev-qa-db-ja.com

SQL Serverで先行ゼロを埋め込むことによる数値の書式設定

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

その中に、当社の従業員バッジ番号は000001から999999までのchar(6)として格納されています。

私は今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を返すはずです。

107
jp2code

合計の長さを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)
158

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

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

参照先: http://msdn.Microsoft.com/ja-jp/library/hh213505.aspx

102
EdMorte

このようにして手順を変更できます

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

しかしこれはあなたのEmployeeIDが数値であると仮定しています、そしてこのコードは結果を文字列に変更します、私は再び元の数値を加えることを勧めます

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

30
Steve

Intを変換しなければならないことを嫌っていましたが、これはずっと簡単に思えます。文字列変換と単純な追加が1つしかないため、パフォーマンスがさらに向上する可能性があります。

選択RIGHT(1000000 + EmployeeId、6)...

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

24
JeffSahol

私は全部一箇所に投稿しています、私が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')
9
Raj kumar

もう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
6
Jamiec

それが得ることができるのと同じくらいきれいにして、変数で置き換える範囲を与えます:

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

バージョン2012以降から使用できます

SELECT FORMAT(EmployeeID,'000000')
FROM dbo.RequestItems
WHERE ID=0
4
Hagop Simonian
SELECT replicate('0', 6 - len(employeeID)) + convert(varchar, employeeID) as employeeID
FROM dbo.RequestItems 
WHERE ID=0
3
Jimbo
SELECT 
    cast(replace(str(EmployeeID,6),' ','0')as char(6)) 
FROM dbo.RequestItems
WHERE ID=0
2
user1227804

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

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

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