ISNULLとCOALESCEは動作が異なる

公開日: : 最終更新日:2013/12/11 SQL Server ,

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

とある人が作成したSQLを見ているとCOALESCEという関数を使用している箇所を見つました。
調べると、引数(カラムや式)を前から順番に解析し「NULL」でないものを発見したら
その値を返してくれるようです。

COALESCEの基本動作

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

を実行すると

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

が返って来ます。

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

COALESCEの戻り値
ZZZ

が返ってきます。

ISNULLとの違い

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

ISNULL関数の説明文には


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

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

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


とあります。

つまり

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

となり実行時エラーになります。
これはデータ型の優先順位が「VARCHAR < INT」のため 'A'をデータ型の優先順位が高いINTに変換しようとしてエラーになった結果です。 上記のSQLは

と修正すれば「'A'」という結果を取得できます。

スポンサーリンク
スポンサーリンク
  • このエントリーをはてなブックマークに追加
  • 13 follow us in feedly

関連記事

TOP句で変数を使ってSQLを1行にする

TOP句で変数を使ってSQLを1行にする TOP句を使って複雑なSQLを簡単にします。 SE

記事を読む

SQLサーバ

1行のINSERT文で複数のデータを挿入する方法

1行のInsertで複数件のデータ挿入 これまでは1行INSERT文では1行のデータしか挿入できま

記事を読む

ALTER TABLEで既存のテーブルのプライマリーキー(主キー)を変更する

ALTER TABLEで既存のテーブルのプライマリーキー(主キー)を変更する ALTER TA

記事を読む

SQLServerのテーブルやカラムにコメントをつける方法

SQLServerでテーブルやカラムにコメントをつける SQLServerで作成したテーブルやカラ

記事を読む

SQLで指定された年月日の月末日付を取得する

指定された年月日の月末日付を取得 SQLserverには指定された年月日の月末日付を取得する関

記事を読む

SELECTした結果をランダムに並び変える

SQLでSELECTした結果をランダムに並び変えて表示する SQLServerでSELECTした結

記事を読む

指定された月の日数をSQLで求める

指定された月の日数をSQLで求める SQLServerには該当月の日数を求める関数がないので

記事を読む

DATENAME関数を使って日付を取得する。

DATENAME関数を使って日付取得 SQLServerでDATENAME関数を使って日付を取得し

記事を読む

SQLで改行コードを含む項目を取得する

SQLで改行コードを含む項目を検索する Microsoft SQL Server Managemn

記事を読む

@@ROWCOUNTで処理した件数を取得する

@@ROWCOUNTは直前に処理した件数を取得するための関数 SQLServerでは実行したSQL

記事を読む

SQLServer上にあるテーブルの更新日時を取得する。

テーブルの更新日時を取得 SQLServer上にあるストアドプロシー

ユーザー定義テーブル型変数を使用する

ユーザー定義テーブル型を使ってみる SQLServer 2008には

SQLで存在しない行を生成し固定行数で処理したい時に役立つ方法

帳票データなどで登録されているデータ数に左右されず、 固定行数でデー

DATENAME関数を使って日付を取得する。

DATENAME関数を使って日付取得 SQLServerでDATEN

SQLServer
SQLServerで引数の順序を考慮せずに呼び出せるストアドプロシジャを作る

引数の順序を考慮せずに呼び出せるストアドプロシジャ ストアドプロシジ

→もっと見る



PAGE TOP ↑