🙌

SQL Server の ISNULL での型に関する注意

2021/10/14に公開

SQL Server の ISNULL(第1引数, 第2引数) は、

  • 第1引数がNULLではない時、第1引数を返し、型は第1引数の型である。
  • 第2引数がNULLの時、第2引数を返し、型は第2引数の型である。

そのため、第1引数と第2引数で型が異なると返り値の型が一意に決まらない。

次のクエリでは KINGAKU (型 money) と 0 (型 int) が ISNULL の引数となっているが、KINGAKUNULL かどうかによって型が変わる。

SELECT ISNULL(KINGAKU, 0)

そのため、SELECTの返り値の型を外部で利用する場合やSELECTから一時テーブルを作る場合に想定している money ではない型が設定される。

次のクエリは TABLE2 のINSERT時にエラーとなる。

SELECT
    ISNULL(KINGAKU1, 0) AS KINGAKU
INTO #NEWTABLE
FROM
    TABLE1

INSERT #NEWTABLE
SELECT
    ISNULL(KINGAKU2, 0) AS KINGAKU
FROM
    TABLE2

対策

  • $0 を用いるようにする。
  • CAST で型を指定する。
  • INTO を使用せず、一時テーブルを定義する。
SELECT ISNULL(KINGAKU, $0)
SELECT
    ISNULL(KINGAKU1, $0) AS KINGAKU
INTO #NEWTABLE
FROM
    TABLE1

INSERT #NEWTABLE
SELECT
    ISNULL(KINGAKU2, $0) AS KINGAKU
FROM
    TABLE2

Discussion