皆さんはSQL ServerでNullを置き換える場合にどのようなクエリを実行していますか?
どのDBMSでも、Nullを置き換える方法は一つだけではありません。
もちろんSQL Serverでもその方法はいくつか存在します。
そこで今回は、この「Nullを置き換える方法」について解説していきたいと思います。
今既にNullを置き換える方法を知っている方も、この記事を読めば更に簡単な方法が見つかるかもしれません。
是非最後まで読んでみてください!
NVLはOracleのみ
インターネットで「Null 置換」と検索すると最初のページにはNVL関数に関する記事が出てくると思います。
このNVL関数はNullを置き換えるための関数ですが、残念な事にSQL Serverでは使えません。
少し余談ではありますが、ネット記事で「SQL文」と書かれている記事の大半はOracle、SQL Server、MySQL、PostgreSQLなど全てのDBMSをSQLとしてまとめています。
なので実際にコードを記述してみると自分の環境では使用できなかったなんて言うことが多々あります。
このNVL関数についても、恐らくほとんどの記事では「SQL文でNVL関数を使う」というような見出しで書かれているため、初心者の方にとっては非常に解り難い結果となっています。
SQL ServerでのNullの置換
ではSQL Serverではどの関数を使用すれば良いのでしょうか。
まずは代表的なところから解説していくと、SQL ServerでNullを置換するためには「IsNull」という関数があります。
この関数はNVL関数と使い方も同じであるため、OracleからSQL Serverに乗り換えた方でもそのままの知識で使用出来ます。
なおIsNull関数の記述方法については次の通りです。
IsNull([項目名], [代替文字列])
記述はたったこれだけでOKです。
IsNullの第一引数には置換したいフィールドを指定し、第二引数で置換する文字列または数値を指定します。
ではサンプルコードで実際に見てみましょう。
INSERT INTO sample_table(id, number) VALUES(1, 10) INSERT INTO sample_table(id, number) VALUES(2, 20) INSERT INTO sample_table(id, number) VALUES(3, null) INSERT INTO sample_table(id, number) VALUES(4, 40) INSERT INTO sample_table(id, number) VALUES(5, null) SELECT *, IsNull(number, 0) AS IsNullNumber FROM sample_table; id number IsNullNumber ----------- ----------- ------------ 1 10 10 2 20 20 3 NULL 0 4 40 40 5 NULL 0
上のサンプルコードで期待できる結果としては、numberというカラムのNull値の置き換えです。
コードを実行してみたところ、IsNullの第二引数で指定している「0(int)」に置き換わっていることが確認できました。
※ここでは解りやすくASを使って新規フィールド(IsNullNumber)を作っています。
CASEで置換する
先ほどはSQL Serverにおける代表的な置換方法について解説しましたが、Nullの置換は別の方法でも可能です。
ここではもう一つの方法として「CASE関数」を使って置換する方法について解説していきます。
まずはCASEで置換する場合の記述方法について見てみましょう。
CASE WHEN [項目名] IS NULL THEN [文字列] ELSE [項目名] END FROM [テーブル名]
CASE関数自体は、Null値の置換に特化した関数ではないため、先ほどのIsNullと比較して、記述自体は冗長となっています。
実際にサンプルコードで見てみましょう。
INSERT INTO sample_table(id, number) VALUES(1, 10) INSERT INTO sample_table(id, number) VALUES(2, 20) INSERT INTO sample_table(id, number) VALUES(3, null) INSERT INTO sample_table(id, number) VALUES(4, 40) INSERT INTO sample_table(id, number) VALUES(5, null) SELECT *, CASE WHEN number IS NULL THEN 0 ELSE number END AS IsNullNumber FROM sample_table; id number IsNullNumber ----------- ----------- ------------ 1 10 10 2 20 20 3 NULL 0 4 40 40 5 NULL 0
期待する結果は先ほどと同じですが、今度はCASE関数を使って記述しています。
コードを実行してみると、先ほどと同じ結果が得られることが確認できました。
メリットとデメリット
CASE関数を使う場合はIsNull関数と比較して記述が冗長になってしまうことがデメリットといえます。
逆にメリットとしては、IsNull関数はNull値を置換する場合にしか使用することが出来ませんが、CASE関数を使えばNull値以外でも置換が可能となるため柔軟に対応できます。
使い勝手を考えるならCASE関数で慣れておいた方が良いでしょう。
まとめ
いかがでしたか?
今回はSQL ServerでNull値を置換する場合の方法を二つ解説しました。
IsNull関数についてはNull値の置換に特化された関数であるため、柔軟性には欠けますが記述自体は非常に簡単です。
どちらを使うかは好みによって分かれますが、結果としてビッグデータを扱う場合であってもどちらでも問題なく使用でき、処理速度が遅くなるということもありません。
今現在SQLを学習中の方は、出来るだけ多くの関数や演算子を覚えておいた方が良いため、この記事を読みながら両方マスターできるように何度も繰り返し練習してみてください。