SQL Serverでは、NULLIF()
expressionは、指定された2つの式の値をチェックします。等しい場合はnull値を返し、そうでない場合は最初の式を返します。
構文
構文は次のようになります:
NULLIF ( expression , expression )
例
デモンストレーションの例を次に示します。
SELECT NULLIF(3, 3);
結果:
NULL
ここでは、両方の式が等しいため、結果はnull値になります。
式が等しくない場合は、次のようになります。
SELECT NULLIF(3, 7);
結果:
3
今回は最初の値が返されます。
両方の結果をカプセル化した例を次に示します。
SELECT
NULLIF(0, 0) AS a,
NULLIF(3, 3) AS b,
NULLIF(3, 0) AS c,
NULLIF(0, 3) AS d;
結果:
+------+------+-----+-----+ | a | b | c | d | |------+------+-----+-----| | NULL | NULL | 3 | 0 | +------+------+-----+-----+
実用的な例
次のデータを含むテーブルがあるとします。
SELECT
ProductName,
ProductPrice
FROM Products;
結果:
+-------------------------------------+----------------+ | ProductName | ProductPrice | |-------------------------------------+----------------| | Left handed screwdriver | 25.99 | | Long Weight (blue) | 14.75 | | Long Weight (green) | 11.99 | | Smash 2000 Sledgehammer | 0.00 | | Chainsaw (includes 3 spare fingers) | 0.00 | | Straw Dog Box | NULL | | Bottomless Coffee Mugs (4 Pack) | 9.99 | | Right handed screwdriver | 25.99 | +-------------------------------------+----------------+ (8 rows affected)
そして、正の価格の製品がいくつあるかを調べたいとします。つまり、価格がゼロまたはnull値の商品は含めたくありません。
これを行うには、NULLIF()
を使用できます COUNT()
と組み合わせて 機能:
SELECT
COUNT(NULLIF(ProductPrice, 0.00)) AS Result
FROM Products;
結果:
+----------+ | Result | |----------| | 5 | +----------+ Warning: Null value is eliminated by an aggregate or other SET operation.
期待どおりに5が得られます。これは、ProductPrice
で正の値を持つ行の数とまったく同じです。 桁。
これは、COUNT()
が機能するために機能します 関数はnull以外の値のみをカウントします。ゼロの量をnullに変換することで、計算でそれらの値を無視することができます。
ここでもNULLIF()
はありません 機能。
SELECT COUNT(ProductPrice) AS Result
FROM Products;
結果:
+----------+ | Result | |----------| | 7 | +----------+ Warning: Null value is eliminated by an aggregate or other SET operation.
今回はゼロの金額が含まれ、7が得られます。実際にはnull値であるため、行6は無視されます。
最初の引数がヌル定数の場合
この関数は、最初の引数としてnull定数を受け入れません:
SELECT NULLIF(null, 3);
結果:
Msg 4151, Level 16, State 1, Line 1 The type of the first argument to NULLIF cannot be the NULL constant because the type of the first argument has to be known.
エラーメッセージに示されているように、最初の引数のタイプを知っている必要があります。関数の戻り値は最初の式のデータ型を使用し、このエラーはそれを反映しています。
このエラーは非常にまれです。ほとんどの場合、最初の引数として列名を渡します。SQLServerでは、列のデータ型が定義されています。このような場合、SQL Serverは列のデータ型を認識しているため、実際にはnull値が受け入れられます。
変数についても同じことが言えます。変数を渡す場合は、その型を宣言する必要があるため、エラーは発生しません。
無効な引数カウント
引数を渡さずに関数を呼び出すと、エラーが発生します:
SELECT NULLIF();
結果:
Msg 102, Level 15, State 1, Line 1 Incorrect syntax near ')'.
また、あまりにも多くの引数を渡すとエラーが発生します:
SELECT NULLIF(1, 2, 3);
結果:
Msg 102, Level 15, State 1, Line 1 Incorrect syntax near ','.