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
  • 関連記事

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

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

    記事を読む

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

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

    記事を読む

    SQLServer

    SQLで検索結果を縦横変換する

    SQLで検索結果を縦横変換する SQLで取得した各行を一定のくくりで横に表示させたいときがあります

    記事を読む

    SQLで西暦から和暦変換を行う

    SQLを使って西暦から和暦変換を行う SQLServerには西暦和暦変換関数が無いようなので、

    記事を読む

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

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

    記事を読む

    SQLServerで作ったテンポラリテーブルが見つからず無効になってしまう

    SQLServerでテンポラリテーブルを利用して処理を行う時に 「オブジェクト名 '#tmp_ta

    記事を読む

    列は既にデフォルトにバインドされています。

    テーブルのカラムの属性変更でデフォルト値を変更する テーブルのカラムの属性変更でデフォルト値を変更

    記事を読む

    春分の日と秋分の日をSQLで求める計算式

    春分の日と秋分の日は毎年違う 春分の日と秋分の日は 祝日としての春分の日・秋分の日は、 前

    記事を読む

    SQLServerでホスト名を取得する

    SQLServerが動作しているホスト(サーバ)名取得 SQLServerでSQLServerが動

    記事を読む

    SQLサーバ

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

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

    記事を読む

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

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

    sp_columns – SQL Serverでカラムの型を取得する

    SQL Serverで定義されているテーブルのカラムの型を取得する

    SQLServerでsp_renameを使ってテーブルの列名を変更する

    SQLServerで列名を変更するには sp_renameを使って列

    SELECTでUNIONは複数個使える

    SELECTでの複数のUNIONの使い方 SELECTでUNIONは

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

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

    →もっと見る



    PAGE TOP ↑