ISNULLとCOALESCEは動作が異なる

記事内に広告が含まれています。

ISNULLとCOALESCEは動作が異なります。

その違いを解説します。

ISNULLとCOALESCEは動作が異なるので注意が必要

SQLを見ているとCOALESCEという関数を使用している箇所を見つました。

調べると、引数(カラムや式)を前から順番に解析し「NULL」でないものを発見したらその値を返してくれるようです。

COALESCEの基本動作

COALESCEは引数(カラムや式)を前から順番に解析し「NULL」を返す。

SELECT COALESCE( NULL, NULL, NULL, 'ここまで全部NULL' ) AS COALESCEの戻り値

を実行すると

COALESCEの戻り値
ここまで全部NULL

が返って来ます。

SELECT COALESCE( NULL, 'ZZZ', NULL, 'ここまで全部NULL' ) AS COALESCEの戻り値

を実行すると最初のNULLでない値

COALESCEの戻り値
ZZZ

が返ってきます。

ISNULLとの違い

SQLServerで使用できるISNULL関数のチェックする値(引数)が複数バージョンかと思いきや注意が必要で、ISNULL関数とCOALESCE関数では戻り値の型が異なります。

ISNULL関数の説明文には


構文
ISNULL( check_expression , replacement_value )
戻り値
check_expression と同じ型を返します。

とあり、COALESCE関数の説明文には

構文
COALESCE( expression [ ,…n ] )
戻り値
expression のデータ型のうち、最も優先順位が高いものを返します。


とあります。

つまり

SELECT ISNULL( CAST( 'A' AS VARCHAR), 0 )

は「’A’」という結果をVARCHAR型で受け取れますが、

SELECT COALESCE( CAST( 'A' AS VARCHAR), 0 )

メッセージ 245、レベル 16、状態 1、行 1
varchar の値 'A' をデータ型 int に変換できませんでした。

となり実行時エラーになります。
これはデータ型の優先順位が「VARCHAR < INT」のため 'A'をデータ型の優先順位が高いINTに変換しようとしてエラーになった結果です。 上記のSQLは [sql] SELECT COALESCE( CAST( 'A' AS VARCHAR), '0' ) [/sql] と修正すれば「'A'」という結果を取得できます。

タイトルとURLをコピーしました