web-dev-qa-db-ja.com

11桁の数値を格納するために使用するデータ型

11桁の数値を格納するためにどのデータ型を使用する必要がありますか?最初の桁として「0」を格納する必要があります。

たとえば、02421402015を格納する場合、02421402015を表示する必要があります。 varcharを使用してみたところ、2421402015と表示されました。

3
Last Bench Mind

数値をBIGINTとして保存し、単純に数値を好きなように表示することをお勧めします。

_DECLARE @Num BIGINT;

SET @Num = 2421402015;

SELECT CONVERT(VARCHAR(11), REPLICATE('0', 11 - LEN(@Num))) 
    + CONVERT(VARCHAR(11), @Num);
_

Aaron Bertrand のコメントで指摘されているように、必要なゼロの文字列の長さを計算せず、単に文字列を切り捨てるほうがパフォーマンス面で優れています。

_SELECT RIGHT(REPLICATE('0', 11) + CONVERT(VARCHAR(11), @Num), 11);
_

サンプル番号の場合、連結の結果は「000000000002421402015」になり、11桁に右に切り捨てられます。

_02421402015
_

実際、 srutzky が指摘しているように、これはさらに最適化して次のようにすることができます。

_SELECT RIGHT('00000000000' + CONVERT(VARCHAR(11), @Num), 11);
_

ユーザーがWHERE句で一致させる必要のある先行ゼロを含む値を渡す場合、最初に検索語を整数に変換し、それを述語で使用して、インデックスを使用できるようにします。

ブログ投稿しました1 これは、数値を整数として格納する方法を詳しく説明すると同時に、数値に先行ゼロを付けてデータベースに格納されているように見せるエレガントな方法を提供します。詳細は http://www.sqlserver.science/basics/how-do-i-store-a-number-with-leading-zeros/ を確認してください!先頭のゼロの列をフォーマットする方法は他にもいくつかありますが、 各メソッドのパフォーマンスはさまざまです 非常に劇的です。 RIGHT('00000000000' + CONVERT(VARCHAR(11), @Num), 11)メソッドは、最速のように見えます。


1-私のブログ投稿は SQL PASS Community Connector News で紹介されました
2- Follow up post SQL Server 2012以降でのFORMATMESSAGE()関数のパフォーマンスについて

14
Max Vernon

あなたの質問であなたが言っていることが真実ではないことを示すために:

_DECLARE @x TABLE(y VARCHAR(11));

INSERT @x(y) VALUES('02421402015');

SELECT y FROM @x;
_

結果:

_y
-----------
02421402015
_

私たちはあなたの問題をよりよく理解できるように、何が起こっているのかについてより詳細に教えてください。

ただし、最も重要なのは、ストレージをプレゼンテーションから分離することを検討する必要があることです。 varchar(11)(11バイト+長さを示す2バイト)ではなく、int(4バイト)またはbigint(8バイト)として数値を格納する方がはるかに効率的です。検証(つまり、誰かが数値の代わりに_I'm varchar_を格納できない)、算術などで、暗黙的または明示的な変換が必要になることなく。表示用の先頭の_0_をプレゼンテーション層に追加するのは簡単ですが、本当に必要な場合はクエリ時にSQL Serverに追加することもできます。また、受信した検索条件を追加または削除して、ユーザーが検索および表示している内容に関係なく、適切なパラメーター型を使用して、適切で最も効率的なデータ型に対して検索することも簡単です...

6
Aaron Bertrand