おそらく、FORMAT()
のあまり知られていない機能の1つです。 SQL Serverの関数は、数値に条件付き書式を適用できるようにする関数です。
これは、SQL Server(またはT-SQL)機能というよりも.NET機能ですが、SQL Server / T-SQLはすべて同じようにサポートしているため、数値に条件付き書式を適用する機能を最大限に活用できます。
それはすべて、FORMAT()
に渡すフォーマット文字列に帰着します 働き。
数値が正、負、またはゼロのいずれであるかに応じて、数値のフォーマット方法を指定するフォーマット文字列を渡すことができます。
明確にするために、私は色やフォントなどで数値をフォーマットすることについて話しているのではありません。通常FORMAT()
を使用する数値のフォーマットについてのみ話しているのです。 関数(千の区切り記号、パーセント記号、小数点などの追加など)。
また、この条件付き書式は非常に制限されています。テストできる条件は3つ(正、負、またはゼロ)のみです。ただし、必要に応じて、同じフォーマットを2つの条件に同時に適用することもできます。
いずれにせよ、FORMAT()
の使い方は次のとおりです。 SQLServerの数値に条件付き書式を適用する関数。
;
の紹介 –セクションセパレーター
.NETはセミコロン(;
)を定義します )セクションセパレータと呼ばれる、カスタム数値形式指定子の1つとして 。
セクションセパレータは、正、負、およびゼロの数値に対して個別のフォーマット文字列を持つセクションを定義する条件付きフォーマット指定子です。これにより、数値が正、負、またはゼロのいずれであるかに応じて、数値に異なるフォーマットを適用できます。
カスタム数値形式の文字列には、セミコロンで区切られた最大3つのセクションを含めることができます。これらは次のとおりです。
- 1つのセクション :この場合、条件付き書式は適用されません。フォーマット文字列はすべての値に適用されます。セクションセパレータは必要ありません(セクションが1つしかないため)。間違いなく、これはフォーマット文字列の最も一般的な形式です。
- 2つのセクション :最初のセクションは正の値とゼロに適用され、2番目のセクションは負の値に適用されます。
フォーマットする数値が負であるが、2番目のセクションのフォーマットに従って丸めた後にゼロになる場合、結果のゼロは最初のセクションに従ってフォーマットされます。
- 3つのセクション :最初のセクションは正の値に適用され、2番目のセクションは負の値に適用され、3番目のセクションはゼロに適用されます。
2番目のセクションは(セミコロンの間に何も入れないことで)空のままにすることができます。その場合、最初のセクションはすべての非ゼロ値に適用されます。
フォーマットされる数値がゼロ以外であるが、最初または2番目のセクションのフォーマットに従って丸めた後にゼロになる場合、結果のゼロは3番目のセクションに従ってフォーマットされます。
セクション区切り文字を使用する場合、負の値は常にマイナス記号なしで表示されることに注意してください(ただし、後で説明するように、例外があります)。最終的にフォーマットされた値にマイナス記号を付ける場合は、カスタムフォーマット文字列の一部としてマイナス記号を明示的に含める必要があります。これは、数値に関連付けられている他の既存の書式にも適用されます。
例1– 1つのセクション(条件付き書式なし)
これは、1つのセクションで構成される一般的な数値形式の文字列です。セクション区切り文字は使用されないため、条件付き書式は適用されません 。
コード:
SELECT FORMAT(123, '0 (Number)') Positive, FORMAT(-123, '0 (Number)') Negative, FORMAT(0, '0 (Number)') Zero;
結果:
+--------------+---------------+------------+ | Positive | Negative | Zero | |--------------+---------------+------------| | 123 (Number) | -123 (Number) | 0 (Number) | +--------------+---------------+------------+
マイナス記号はそのまま残っていることに注意してください。セクションセパレータを使用した場合、これは削除されます。
例2– 2つのセクション(条件付き書式)
ここから条件付き書式が始まります。
この例では、2つのセクションがあります(1つのセクションセパレーターで区切られています)。セパレータの左側のセクションは、正またはゼロのいずれかの値にのみ適用されます。右側のセクションは、負の値にのみ適用されます。
コード:
SELECT FORMAT(123, '0 (Positive or Zero); 0 (Negative)') Result;
結果:
+------------------------+ | Result | |------------------------| | 123 (Positive or Zero) | +------------------------+
この場合、数値は正であったため、最初のセクションを使用してフォーマットしました。
例3– 2つのセクション(同じフォーマット文字列、異なる値)
次の例では、同じフォーマット文字列が異なる値(正、負、およびゼロ)に適用されます。
コード:
SELECT FORMAT(123, '0 (Positive or Zero); 0 (Negative)') Positive, FORMAT(-123, '0 (Positive or Zero); 0 (Negative)') Negative, FORMAT(0, '0 (Positive or Zero); 0 (Negative)') Zero;
結果:
+------------------------+-----------------+----------------------+ | Positive | Negative | Zero | |------------------------+-----------------+----------------------| | 123 (Positive or Zero) | 123 (Negative) | 0 (Positive or Zero) | +------------------------+-----------------+----------------------+
したがって、この例は、セクションセパレータの真の利点を示しています。つまり、値に応じて異なる結果を得ることができます。
例4–丸めのある2つのセクション
2つのセクションを使用する場合、ゼロに丸められる負の値は、最初のフォーマット文字列でフォーマットされます。
コード:
SELECT FORMAT(0.1, '0 (Positive or Zero); 0 (Negative)') Positive, FORMAT(-0.1, '0 (Positive or Zero); 0 (Negative)') Negative;
結果:
+----------------------+----------------------+ | Positive | Negative | |----------------------+----------------------| | 0 (Positive or Zero) | 0 (Positive or Zero) | +----------------------+----------------------+
例5– 3つのセクション(基本的な使用法)
3つのセクションを指定する基本的な例を次に示します。これを実現するために、2つのセクションセパレータを使用します。
コード:
SELECT FORMAT(123, '0 (Positive); 0 (Negative); 0 (Zero)') Result;
結果:
+----------------+ | Result | |----------------| | 123 (Positive) | +----------------+
この場合、数値は正の値であったため、最初のセクションでフォーマットされました。
例6– 3つのセクション(同じフォーマット文字列、異なる値)
この例は、入力値に応じて、前の例から得られるさまざまな結果を示しています。
ここでは、同じフォーマット文字列が異なる値に適用されます。フォーマット文字列も変数に割り当てますが、これは読みやすくするためです。
DECLARE @formatstring varchar(35); SET @formatstring = '0 (Positive); 0 (Negative); 0 (Zero)'; SELECT FORMAT(123, @formatstring) 'Positive', FORMAT(-123, @formatstring) 'Negative', FORMAT(0, @formatstring) 'Zero', FORMAT(0.123, @formatstring) 'Rounded to Zero';
結果:
+----------------+-----------------+----------+-------------------+ | Positive | Negative | Zero | Rounded to Zero | |----------------+-----------------+----------+-------------------| | 123 (Positive) | 123 (Negative) | 0 (Zero | 0 (Zero | +----------------+-----------------+----------+-------------------+
例7– 3つのセクション(空のセクションを含む)
2番目のフォーマット文字列を空のままにすると、最初のセクションがすべてのゼロ以外の値に適用されます。空のままにするには、セミコロンの間に何も残さないでください。
コード:
SELECT FORMAT(123, '0 (Nonzero);; 0 (Zero)') 'Positive', FORMAT(-123, '0 (Nonzero);; 0 (Zero)') 'Negative', FORMAT(0, '0 (Nonzero);; 0 (Zero)') 'Zero', FORMAT(0.123, '0 (Nonzero);; 0 (Zero)') 'Rounded to Zero';
結果:
+---------------+----------------+-----------+-------------------+ | Positive | Negative | Zero | Rounded to Zero | |---------------+----------------+-----------+-------------------| | 123 (Nonzero) | -123 (Nonzero) | 0 (Zero) | 0 (Zero) | +---------------+----------------+-----------+-------------------+
興味深いことに、この場合、負の値のマイナス記号はそのまま残ります。
例8–マイナス記号
前述のように、セクションセパレータは、数値に関連付けられている既存の書式を無視します。これには、負の値のマイナス記号が含まれます(ただし、前の例はこれに対する例外のようです)。
マイナス記号を含める場合は、それをフォーマット文字列に明示的に追加する必要があります。以下の例。
コード:
SELECT FORMAT(-123, '0 (P); 0 (N); 0 (Z)') 'Without minus sign', FORMAT(-123, '0 (P); -0 (N); 0 (Z)') 'With minus sign';
結果:
+----------------------+-------------------+ | Without minus sign | With minus sign | |----------------------+-------------------| | 123 (N) | -123 (N) | +----------------------+-------------------+
指摘したように、前の例はこれに対する例外のように思われるので、覚えておくべきことがあります。前の例で負の値のフォーマット文字列にマイナス記号を追加すると、次のようになります。
SELECT FORMAT(-123, '-0 (Nonzero);; 0 (Zero)') Result;
結果:
+-----------------+ | Result | |-----------------| | --123 (Nonzero) | +-----------------+