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]

少数のゼロパディング
少数部のみゼロ埋めしたい場合、書式 '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]

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 <テーブル名>
解説
-
ABS関数 で マイナス値 を プラス値 にします。ABS関数は絶対値を返します。
-123 -> 123
-
CAST関数 で 数値を 文字列に変換します。CAST関数 は 型変換を行う関数です。代わりに、CONVERT 関数も使用できます。
123 -> '123'
-
文字列 の 先頭に、桁数分の '0' を結合します。
'123' -> '00000123'
-
RIGHT 関数を使用し、右側から 桁数分、文字列を切り出します。RIGHT関数 は 指定した桁数分だけ、文字列の末尾を切り出します。
'00000123' -> '00123'
-
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]

参考資料
- Microsoft 公式ドキュメント - FORMAT(Transact-SQL)
- Microsoft 公式ドキュメント - RIGHT(Transact-SQL)
- Microsoft 公式ドキュメント - ABS(Transact-SQL)
- Microsoft 公式ドキュメント - 論理関数 - IIF(Transact-SQL)
- Microsoft 公式ドキュメント - CAST および CONVERT(Transact-SQL)
- Microsoft 公式ドキュメント - ISNULL(Transact-SQL)
検証環境
- Microsoft SQL Server 2022 (RTM-CU10) (KB5031778) - 16.0.4095.4 (X64) Oct 30 2023 16:12:44 Copyright (C) 2022 Microsoft Corporation Express Edition (64-bit) on Linux (Ubuntu 22.04.3 LTS) <X64>
- Docker image: mcr.microsoft.com/mssql/server:2022-latest
- Docker Desktop 4.25.2 (129061)
- Docker Engine Engine: 24.0.6
- Docker Compose v2.23.0-desktop.1
- Microsoft SQL Server Management Studio v19.0.1(19.0.20200.0+9286509b)
- Windows 10 Enterprise Version 22H2 OS Build 19045.3803 Experience: Windows Feature Experience Pack 1000.19053.1000.0