SQL Server - ゼロ埋め(ゼロパディング)する

SQL Serverで数値をゼロパディングするには、FORMAT関数を使用します。FORMAT関数が使用できない環境では、代わりにRIGHT関数を使用することができます。

FORMAT関数で整数型をゼロパディングする方法

FORMAT関数に、式(列名や値)と書式を渡します。
FORMAT(式, '<書式>')

単純に書式を指定すると、プラス値とマイナス値で表示桁にずれが生じます。書式を セミコロン(;) で区切ると、値がプラスの場合とマイナスの場合でそれぞれ書式を指定することができます。これを利用すると、プラス値とマイナス値が混在する場合でも桁数を揃えることが可能です。

また、FORMAT関数に NULL を渡すと NULL が返されます。そのため、NULLをゼロや空文字列に変換したい場合は、ISNULL関数を使用します。

NULLの場合、NULLで表示したいとき

FORMAT関数に NULL を渡すと、NULL が返ります。サンプルコード中の 'D4' と '0000' は 表示したい桁数に合わせて修正します。
SELECT
       FORMAT(<列名>, 'D4')          AS プラス符号の箇所は非表示     --例 '0001'
      ,FORMAT(<列名>, '00000;-0000') AS プラス符号の箇所はゼロ       --例 '00001'
      ,FORMAT(<列名>, ' 0000;-0000') AS プラス符号の箇所はスペース   --例 ' 0001'
      ,FORMAT(<列名>, '+0000;-0000') AS プラス符号を表示            --例 '+0001'
  FROM <テーブル名>

NULLの場合、0で表示したいとき

ISNULL関数を使用し、値が NULL のときは ゼロに変換してから FORMAT関数に渡します。
SELECT
       FORMAT(ISNULL(<列名>,0), 'D4')          AS プラス符号の箇所は非表示     --例 '0001'
      ,FORMAT(ISNULL(<列名>,0), '00000;-0000') AS プラス符号の箇所はゼロ       --例 '00001'
      ,FORMAT(ISNULL(<列名>,0), ' 0000;-0000') AS プラス符号の箇所はスペース   --例 ' 0001'
      ,FORMAT(ISNULL(<列名>,0), '+0000;-0000') AS プラス符号を表示            --例 '+0001'
  FROM <テーブル名>

NULLの場合、空文字列で表示したいとき

ISNULL関数を使用し、FORMAT関数の結果が NULL の場合は 空文字列 に変換します。
SELECT
       ISNULL(FORMAT(<列名>, 'D4'),'')          AS プラス符号の箇所は非表示     --例 '0001'
      ,ISNULL(FORMAT(<列名>, '00000;-0000'),'') AS プラス符号の箇所はゼロ       --例 '00001'
      ,ISNULL(FORMAT(<列名>, ' 0000;-0000'),'') AS プラス符号の箇所はスペース   --例 ' 0001'
      ,ISNULL(FORMAT(<列名>, '+0000;-0000'),'') AS プラス符号を表示            --例 '+0001'
  FROM <テーブル名>

サンプルSQL

次のサンプルSQLは FORMAT関数 を使用し、Point列 を 5桁にゼロ埋めしています。
--NULLはNULLで表示
SELECT [Point]                        AS 元の値
      ,FORMAT([Point], 'D4')          AS プラス符号の箇所は非表示
      ,FORMAT([Point], '00000;-0000') AS プラス符号の箇所はゼロ
      ,FORMAT([Point], ' 0000;-0000') AS プラス符号の箇所はスペース
      ,FORMAT([Point], '+0000;-0000') AS プラス符号を表示
  FROM [SampleTable]

--NULLは0で表示
SELECT [Point]                                  AS 元の値
      ,FORMAT(ISNULL([Point],0), 'D4')          AS プラス符号の箇所は非表示
      ,FORMAT(ISNULL([Point],0), '00000;-0000') AS プラス符号の箇所はゼロ
      ,FORMAT(ISNULL([Point],0), ' 0000;-0000') AS プラス符号の箇所はスペース
      ,FORMAT(ISNULL([Point],0), '+0000;-0000') AS プラス符号を表示
  FROM [SampleTable]

--NULLは空文字列で表示
SELECT [Point]                                   AS 元の値
      ,ISNULL(FORMAT([Point], 'D4'),'')          AS プラス符号の箇所は非表示
      ,ISNULL(FORMAT([Point], '00000;-0000'),'') AS プラス符号の箇所はゼロ
      ,ISNULL(FORMAT([Point], ' 0000;-0000'),'') AS プラス符号の箇所はスペース
      ,ISNULL(FORMAT([Point], '+0000;-0000'),'') AS プラス符号を表示
  FROM [SampleTable]
サンプルSQL(整数ゼロ埋め)の実行結果
サンプルSQL(整数ゼロ埋め)の実行結果

少数のゼロパディング

少数部のみゼロ埋めしたい場合、書式 'F<少数部桁数>' を使用します。 整数部 もゼロ埋めしたい場合は次のように、桁数分のゼロを指定します。
SELECT
       FORMAT(<列名>, 'F2')                 AS 少数部を2桁ゼロ埋め          --例 '123.40'
      ,FORMAT(<列名>, '00000.00;-00000.00') AS プラス符号の箇所はゼロ       --例 '00123.40'
      ,FORMAT(<列名>, ' 0000.00;-0000.00')  AS プラス符号の箇所はスペース   --例 ' 0123.40'
      ,FORMAT(<列名>, '+0000.00;-0000.00')  AS プラス符号を表示            --例 '+0123.40'
  FROM <テーブル名>

サンプルSQL

次のサンプルSQLは FORMAT関数 を使用し、Point列(DECIMAL型) を ゼロ埋めしています。
--NULLはNULLで表示
SELECT [Point]                                AS 元の値
      ,FORMAT([Point], 'F3')                  AS プラス符号の箇所は非表示
      ,FORMAT([Point], '00000.000;-0000.000') AS プラス符号の箇所はゼロ
      ,FORMAT([Point], ' 0000.000;-0000.000') AS プラス符号の箇所はスペース
      ,FORMAT([Point], '+0000.000;-0000.000') AS プラス符号を表示
  FROM [SampleTable]


--NULLは0で表示
SELECT [Point]                                          AS 元の値
      ,FORMAT(ISNULL([Point],0), 'F3')                  AS プラス符号の箇所は非表示
      ,FORMAT(ISNULL([Point],0), '00000.000;-0000.000') AS プラス符号の箇所はゼロ
      ,FORMAT(ISNULL([Point],0), ' 0000.000;-0000.000') AS プラス符号の箇所はスペース
      ,FORMAT(ISNULL([Point],0), '+0000.000;-0000.000') AS プラス符号を表示
  FROM [SampleTable]


--NULLは空文字列で表示
SELECT [Point]                                           AS 元の値
      ,ISNULL(FORMAT([Point], 'F3'),'')                  AS プラス符号の箇所は非表示
      ,ISNULL(FORMAT([Point], '00000.000;-0000.000'),'') AS プラス符号の箇所はゼロ
      ,ISNULL(FORMAT([Point], ' 0000.000;-0000.000'),'') AS プラス符号の箇所はスペース
      ,ISNULL(FORMAT([Point], '+0000.000;-0000.000'),'') AS プラス符号を表示
  FROM [SampleTable]
サンプルSQL(少数ゼロ埋め)の実行結果
サンプルSQL(少数ゼロ埋め)の実行結果

RIGHT関数でゼロパディング(マイナス値対応版)

サンプル中の '0000' は、ゼロ埋めしたい桁数に合わせてください。例えば、6桁にしたい場合は '00000' です。
SELECT
       IIF(<列名> >= 0, '' , '-') + RIGHT('0000' + CAST(ABS(<列名>) AS VARCHAR), <桁数 - 1>) AS プラス符号の箇所は非表示
      ,IIF(<列名> >= 0, '0', '-') + RIGHT('0000' + CAST(ABS(<列名>) AS VARCHAR), <桁数 - 1>) AS プラス符号の箇所はゼロ
      ,IIF(<列名> >= 0, ' ', '-') + RIGHT('0000' + CAST(ABS(<列名>) AS VARCHAR), <桁数 - 1>) AS プラス符号の箇所はスペース
      ,IIF(<列名> >= 0, '+', '-') + RIGHT('0000' + CAST(ABS(<列名>) AS VARCHAR), <桁数 - 1>) AS プラス符号を表示
  FROM <テーブル名>

解説

  1. ABS関数 で マイナス値 を プラス値 にします。ABS関数は絶対値を返します。

    -123 -> 123

  2. CAST関数 で 数値を 文字列に変換します。CAST関数 は 型変換を行う関数です。代わりに、CONVERT 関数も使用できます。

    123 -> '123'

  3. 文字列 の 先頭に、桁数分の '0' を結合します。

    '123' -> '00000123'

  4. RIGHT 関数を使用し、右側から 桁数分、文字列を切り出します。RIGHT関数 は 指定した桁数分だけ、文字列の末尾を切り出します。

    '00000123' -> '00123'

  5. IIF 関数を使用して 値が プラス か マイナス かを判断し、符号やゼロを結合します。IIF関数 は 第1引数 の条件が 真の場合 第2引数の値 を、偽の場合は 第3引数の値 を返します。

    '00123' -> '-00123'

サンプルSQL

次のサンプルは RIGHT関数 を使用し、Point列 を 5桁にゼロ埋めしています。
--NULLはNULLで表示
SELECT [Point]                                                                        AS 元の値
      ,IIF([Point] >= 0, '' , '-') + RIGHT('0000' + CAST(ABS([Point]) AS VARCHAR), 4) AS プラス符号の箇所は非表示
      ,IIF([Point] >= 0, '0', '-') + RIGHT('0000' + CAST(ABS([Point]) AS VARCHAR), 4) AS プラス符号の箇所はゼロ
      ,IIF([Point] >= 0, ' ', '-') + RIGHT('0000' + CAST(ABS([Point]) AS VARCHAR), 4) AS プラス符号の箇所はスペース
      ,IIF([Point] >= 0, '+', '-') + RIGHT('0000' + CAST(ABS([Point]) AS VARCHAR), 4) AS プラス符号を表示
  FROM [SampleTable]

--NULLは0で表示
SELECT [Point]                                                                                        AS 元の値
      ,ISNULL(IIF([Point] >= 0, '' , '-') + RIGHT('0000' + CAST(ABS([Point]) AS VARCHAR), 4),'0000')  AS プラス符号の箇所は非表示
      ,ISNULL(IIF([Point] >= 0, '0', '-') + RIGHT('0000' + CAST(ABS([Point]) AS VARCHAR), 4),'00000') AS プラス符号の箇所はゼロ
      ,ISNULL(IIF([Point] >= 0, ' ', '-') + RIGHT('0000' + CAST(ABS([Point]) AS VARCHAR), 4),' 0000') AS プラス符号の箇所はスペース
      ,ISNULL(IIF([Point] >= 0, '+', '-') + RIGHT('0000' + CAST(ABS([Point]) AS VARCHAR), 4),'+0000') AS プラス符号を表示
  FROM [SampleTable]

--NULLは空文字列で表示
SELECT [Point]                                   AS 元の値
      ,ISNULL(IIF([Point] >= 0, '' , '-') + RIGHT('0000' + CAST(ABS([Point]) AS VARCHAR), 4),'') AS プラス符号の箇所は非表示
      ,ISNULL(IIF([Point] >= 0, '0', '-') + RIGHT('0000' + CAST(ABS([Point]) AS VARCHAR), 4),'') AS プラス符号の箇所はゼロ
      ,ISNULL(IIF([Point] >= 0, ' ', '-') + RIGHT('0000' + CAST(ABS([Point]) AS VARCHAR), 4),'') AS プラス符号の箇所はスペース
      ,ISNULL(IIF([Point] >= 0, '+', '-') + RIGHT('0000' + CAST(ABS([Point]) AS VARCHAR), 4),'') AS プラス符号を表示
  FROM [SampleTable]
サンプルSQL(RIGHT関数でゼロ埋め)の実行結果
サンプルSQL(RIGHT関数でゼロ埋め)の実行結果

参考資料

検証環境