ほとんどの主要なRDBMSは、NULLIF()
をサポートしています。 NULL
を返す演算子 その引数の両方が同等である場合。引数が同等でない場合は、NULLIF()
最初の引数を返します。
NULLIF()
はSQL標準機能です(ISO / IEC 9075仕様に含まれています)。
構文
構文は次のようになります:
NULLIF (V1, V2)
これは、次のCASE
と同等です。 式:
CASE WHEN V1=V2 THEN NULL ELSE V1 END
例
デモンストレーションの例を次に示します。
SELECT NULLIF( 12, 12 );
結果:
NULL
この場合、両方の引数は同一であるため、結果はNULL
になります。 。
RDBMSによっては、NULL値の実際の出力が異なる場合があります。たとえば、psql(PostgreSQLの場合)を使用する場合、NULL値が返されるたびにデフォルトで空の文字列が出力されます(ただし、これは変更できます)。 SQLiteでも同じです(これも変更できます)。
引数が同等でない場合
引数が同等でない場合は、次のようになります。
SELECT NULLIF( 12, 13 );
結果:
12
引数が異なるため、最初の引数が返されます。
文字列
文字列を比較する例を次に示します。
SELECT
NULLIF( 'Gym', 'Gym' ) AS "Same",
NULLIF( 'Gym', 'Bag' ) AS "Different";
結果:
+------+-----------+ | Same | Different | +------+-----------+ | NULL | Gym | +------+-----------+
日付
日付を比較する例を次に示します。
SELECT
NULLIF( DATE '2045-11-25', DATE '2045-11-25' ) AS "Same",
NULLIF( DATE '2045-11-25', DATE '1990-08-15' ) AS "Different";
結果:
+------+------------+ | Same | Different | +------+------------+ | NULL | 2045-11-25 | +------+------------+
表現
NULLIF()
式の現在の値を評価します。したがって、次のような式を渡すと、次のようになります。
SELECT NULLIF( 24, 2 * 12 );
これを取得します:
NULL
2に12を掛けたものは24なので、2つの引数は同等です。
2番目の引数を変更するとどうなりますか:
SELECT NULLIF( 24, 3 * 12 );
結果:
24
最初の引数が返されます。
データベースの例
次のクエリを実行するとします。
SELECT
Name,
LocalName
FROM country
WHERE Region = 'South America'
ORDER BY Name;
結果:
+------------------+-------------------+ | Name | LocalName | +------------------+-------------------+ | Argentina | Argentina | | Bolivia | Bolivia | | Brazil | Brasil | | Chile | Chile | | Colombia | Colombia | | Ecuador | Ecuador | | Falkland Islands | Falkland Islands | | French Guiana | Guyane française | | Guyana | Guyana | | Paraguay | Paraguay | | Peru | Perú/Piruw | | Suriname | Suriname | | Uruguay | Uruguay | | Venezuela | Venezuela | +------------------+-------------------+
ここでは、左側の列に国名があり、右側にそれぞれの国のローカル名があります。
NULLIF()
を追加しましょう クエリの3番目の列へ:
SELECT
Name,
LocalName,
NULLIF(LocalName, Name) AS "Local Name if Different"
FROM country
WHERE Region = 'South America'
ORDER BY Name;
結果:
+------------------+-------------------+-------------------------+ | Name | LocalName | Local Name if Different | +------------------+-------------------+-------------------------+ | Argentina | Argentina | NULL | | Bolivia | Bolivia | NULL | | Brazil | Brasil | Brasil | | Chile | Chile | NULL | | Colombia | Colombia | NULL | | Ecuador | Ecuador | NULL | | Falkland Islands | Falkland Islands | NULL | | French Guiana | Guyane française | Guyane française | | Guyana | Guyana | NULL | | Paraguay | Paraguay | NULL | | Peru | Perú/Piruw | Perú/Piruw | | Suriname | Suriname | NULL | | Uruguay | Uruguay | NULL | | Venezuela | Venezuela | NULL | +------------------+-------------------+-------------------------+
3番目の列は、Name
の値と異なる場合にのみローカル名を返すことがわかります。 桁。同じ場合は、NULL
返されます。
NULLIF()
を使用することもできます クエリ結果をフィルタリングするには:
SELECT
Name,
LocalName
FROM country
WHERE Region = 'South America'
AND NULLIF(LocalName, Name) IS NOT NULL
ORDER BY Name;
結果:
+---------------+-------------------+ | Name | LocalName | +---------------+-------------------+ | Brazil | Brasil | | French Guiana | Guyane française | | Peru | Perú/Piruw | +---------------+-------------------+
この場合、ローカル名がName
と異なる行のみを返しました。 列。
NULLIF()
vs CASE
前述のように、次のコード:
NULLIF (V1, V2)
次のCASE
と同等です 式:
CASE WHEN V1=V2 THEN NULL ELSE V1 END
したがって、CASE
を使用することが可能です NULLIF()
の代わりに式 必要に応じて。 NULLIF()
関数は基本的にCASE
の構文上のショートカットです 表現。
したがって、たとえば、前の例を次のように置き換えることができます。
SELECT
Name,
LocalName
FROM country
WHERE Region = 'South America'
AND (CASE WHEN LocalName = Name THEN NULL ELSE LocalName END) IS NOT NULL
ORDER BY Name;
結果:
+---------------+-------------------+ | Name | LocalName | +---------------+-------------------+ | Brazil | Brasil | | French Guiana | Guyane française | | Peru | Perú/Piruw | +---------------+-------------------+
ただし、NULLIF()
関数ははるかに簡潔です。
パラメータカウントが正しくありません
間違った数の引数を渡すと、エラーが発生します:
SELECT NULLIF( 'One' );
MySQLの結果:
ERROR 1582 (42000): Incorrect parameter count in the call to native function 'NULLIF'