SQLのIS NOT NULLの使い方|IS NULLの使い方も解説
- システム
エンジニア - IS NOT NULLの使い方を覚えたいのですが、どのように実装すればいいですか?
- プロジェクト
リーダー - IS NOT NULL関数やIS NULLの利用法を説明します。利用環境についてもきちんと理解しておくと良いでしょう。
関連記事:
SQL ServerのDATETIMEとは?文字列からの変換や注意点も紹介
SQL Serverの日付データ取得の関数6つ|文字列や数値で取得する方法も説明
SQLServerのINSERT intoの使い方とは?列名を指定する・指定しないINSERT
NULLの演算子と関数の違い
IS NULL演算子は、NULLかどうかを判定する際に利用する演算子で、ISNULL関数は、NULLを指定の文字列に変換する関数です。使い方も非常にシンプルですし、SQL自体はどこの開発現場でも必ずと言っていいほど利用されている言語ですので、積極的に活用して早く自分のものにしましょう。
SQLのIS NOT NULLの使い方3つ
IS NULL演算子に対して「NULL値以外かどうかを判定する」にはIS NOT NULL演算子を使用します。
IS NOT NULLのような否定系のSQL(NOTを使った条件を使ったSQL)はインデックスが使用されないため、テーブルがフルスキャンされることもあり、処理速度悪化の恐れからSELECT文ではあまり使用しません。
SQLの「IS NOT NULL」の使い方について3つ紹介します。
1:IS NOT NULLを記述するための準備
IS NOT NULLの使い方1つ目はIS NOT NULLを記述するための準備についてです。
IS NOT NULLなど否定系のSQL(NOTを使った条件を使ったSQL)はインデックスが使用されないため、テーブルがフルスキャンされることもあり、処理速度悪化の恐れからSELECT文ではあまり使用しません。
但し、条件に一致するレコードが(全体の数%程度の)少ない場合、フルスキャンする方が早くなるため「IS NOT NULL」を使用します。
予め、対象テーブルに条件(NULL)に一致するレコードが全体に占める割合を調査し、(全体の数%程度の)少ない場合、IS NOT NULL演算子を使用します。条件(NULL)に一致するレコードが全体に占める割合が多い場合、NULL以外の値を条件に指定する記述にします。
NULLのカラムに値を設定
SHAIN_ID | SHAIN_NAME | BUSHO_CD |
---|---|---|
S001 | 社員 A一 | B001 |
S002 | 社員 B二 | NULL |
S003 | 社員 C三 | NULL |
NULLのカラムに値を設定する方法についてです。
SQL ServerでNULLのカラムに値を設定する場合は「IS NULL関数」を使用します。(SQL Server以外でのISNULL関数に代わる記述方法については後述します。)
下記にサンプルを示します。上記テーブル情報をもとに、NULLの項目を指定の文字列に置換して取得します。
1
2
3
|
SELECT SHAIN_ID, SHAIN_NAME, ISNULL(BUSHO_CD,'配属未定') AS BUSHO_CD FROM [テーブル情報]
|
上記のSQLを実行した結果です。
1
2
3
4
5
6
|
SHAIN_ID SHAIN_NAME BUSHO_CD
S001 社員 A一 B001
S002 社員 B二 配属未定
S003 社員 C三 配属未定
|
NULLが「配属未定」に変換されています。ISNULL関数により値を変換してデータを取得する際には、AS句で項目に別名をつけるようにします。別名をつけていない場合「(列名なし)」となってしまい、不具合の原因となる恐れもあります。
2:NULLが許容している列をNULLを許容せずに設定変更するサンプル
IS NOT NULLの使い方2つ目はNULLを許容する列からNULLを許容しない列に設定を変更する方法についてです。NULLを許容する列からNULLを許容しない列に設定を変更する場合のサンプルを下記に示します。
1
2
3
|
ALTER TABLE (対象のテーブル名) ALTER COLUMN (設定を変更する列名) (変更する列名の型) NOT NULL;
|
3:カラム値がすべてnullになっている場合のサンプル
IS NOT NULLの使い方3つ目はカラムの値がすべてnullになっている場合にNULLを許容しないカラムに設定を変更する方法についてです。
カラム値がすべてnullになっている場合のサンプルを下記に記します。対象のカラム(COLUMN01, COLUMN02)に0を埋めた後、設定をNOT NULLに変更します。
1
2
3
4
5
6
|
UPDATE TARGET_TABLE SET COLUMN01=0;
UPDATE TARGET_TABLE SET COLUMN02=0;
ALTER TABLE TARGET_TABLE ALTER COLUMN COLUMN01 int NOT NULL;
ALTER TABLE TARGET_TABLE ALTER COLUMN COLUMN02 int NOT NULL;
|
SQLのIS NULLの使い方
ここでは、主にWhere条件で利用することが多くなるNULLかどうかを判定するために利用する演算子と、SQLのIS NULLの使い方を説明しますので、ぜひ参考にしてみてください。
IS NULL演算子の使い方
IS NULL演算子とは、NULLかどうかを判定するために利用する演算子です。主にWhere条件で利用することが多くなるかと思います。
アプリケーション開発の現場で、テーブルにNULLのデータが含まれているかの確認はよくあることです。もちろん、NULL以外のデータの確認もあるでしょう。IS NULL演算子はNULLが利用できるデータベースでは基本的な使い方ですので、早めに使い方はマスターしておきましょう。
使い方は非常に簡単です。まずはNULLのデータを取得する方法を解説します。
上記テーブル情報をもとに検索します。
ID | KU | MACHI |
---|---|---|
1 | 渋谷区 | 桜丘町 |
2 | 港区 | NULL |
3 | 世田谷区 | NULL |
1
2
3
4
|
IS NULL演算子 NULLのデータを取得
SELECT * FROM [テーブル情報] where MACHI IS NULL
|
上記のSQLを実行した結果です。
次にNULL以外のデータを取得するSQL文です。
1
2
3
4
|
IS NULL演算子 NULL以外のデータを取得
SELECT * FROM [テーブル情報] where MACHI IS NOT NULL
|
上記のSQLを実行した結果です。
使い方はとてもシンプルだということを確認できたかと思います。他の条件と組み合わせて早速使ってみましょう。
IS NULL関数の使い方
データベースではNULLが許容されていても、アプリケーションサイドではNULLのためにシステム障害が発生することはよくあります。このようなエラーを起こさないよう、データベースサイドでISNULL関数を利用して、NULLを指定の文字列に置き換える処理を実装することも、SQLプログラミングのひとつです。
こちらも使い方は非常に簡単です。
先ほどと同じテーブル情報をもとに、NULLの項目を指定の文字列に置換しましょう。
ID | KU | MACHI |
---|---|---|
1 | 渋谷区 | 桜丘町 |
2 | 港区 | NULL |
3 | 世田谷区 | NULL |
1
2
3
4
|
ISNULL関数 NULLのデータを指定の文字列に置換
SELECT ID, KU, ISNULL(MACHI,'置換') AS MACHI FROM [テーブル情報]
|
上記のSQLを実行した結果です。
NULLが’置換’に変換されています。
ISNULL関数を使用してデータを取得する際には、AS句で項目に名前をつけましょう。つけていなかったら「(列名なし)」となってしまい、不具合の原因になる恐れもあります。
SQL環境以外のIS NULLに代わる記述方法3つ
SQL Server 以外のDB環境で「IS NULL関数」に代わる記述方法を3つ紹介します。
値がNULLかどうかを判定する「IF NULL演算子」はOracle・DB2・MySQL・PostgreSQL・Accessなどといった多くの環境で使用可能です。
1:Mysql・SQLiteの場合
Mysql・SQLiteの場合、「IS NULL関数」に代わる記述方法として「IFNULL関数」を使用します。
「IFNULL関数」を使用したサンプルを下記に示します。
テーブル情報からカラム「SHAIN_ID」「SHAIN_NAME」「BUSHO_CD(NULLの場合、’配属未定’に置換)」を取得します。
1
2
3
|
SELECT SHAIN_ID, SHAIN_NAME, IFNULL(BUSHO_CD,'配属未定') AS BUSHO_CD FROM [テーブル情報];
|
「IFNULL関数」の代わりに「COALESCE関数」を使うこともできます。
「COALESCE関数」は引数の1番目からn-1番目の値の中で最初にNULLでない値を返します。
「COALESCE関数」を使用したサンプルを下記に示します。
1
2
3
|
SELECT SHAIN_ID, SHAIN_NAME, COALESCE(BUSHO_CD,'配属未定') AS BUSHO_CD FROM [テーブル情報];
|
2:Oracleの場合
Oracleの場合、「IS NULL関数」に代わる記述方法として「NVL関数」を使用します。
「NVL関数」を使用したサンプルを下記に示します。
テーブル情報からカラム「SHAIN_ID」「SHAIN_NAME」「BUSHO_CD(NULLの場合、’配属未定’に置換)」を取得します。
1
2
3
|
SELECT SHAIN_ID, SHAIN_NAME, NVL(BUSHO_CD,'配属未定') AS BUSHO_CD FROM [テーブル情報];
|
3:PostgreSQLの場合
PostgreSQLの場合、「IS NULL関数」に代わる記述方法として「COALESCE関数」を使用します。
「COALESCE関数」を使用したサンプルを下記に示します。
テーブル情報からカラム「SHAIN_ID」「SHAIN_NAME」「BUSHO_CD(NULLの場合、’配属未定’に置換)」を取得します。
1
2
3
|
SELECT SHAIN_ID, SHAIN_NAME, COALESCE(BUSHO_CD,'配属未定') AS BUSHO_CD FROM [テーブル情報];
|
- システム
エンジニア - IS NULL演算子とIS NULL関数の2通りのパターンがあるのですね。IS NOT NULLとIS NULL関数は知識不足でした。ここで確認できて良かったです。
- プロジェクト
リーダー - NULLを許容しているデータベースでは、IS NOT NULLやIS NULL演算子、IS NULL関数ともに利用することが多くなります。開発現場では、両方ともよく利用する命令ですので、早めに理解しておきましょう。
SQLのIS NULL・IS NOT NULLの使い方を覚えよう
IS NULL演算子は「NULLかどうかを判定する際に使用する演算子」で、ISNULL関数は「NULLを指定の文字列に変換する関数」です。似ていますが、役割は異なります。
またIS NOT NULL演算子はIS NULL演算子と逆に「NULL以外を探す際に使用する演算子」ですので、こちらも合わせてしっかり覚えておきましょう。
SQL自体はどこの開発現場でも必ずと言っていいほど利用されている言語です。積極的に活用し、早く自分のものにしていくことが大切です。
FEnet.NETナビ・.NETコラムは株式会社オープンアップシステムが運営しています。
株式会社オープンアップシステムはこんな会社です
秋葉原オフィスには株式会社オープンアップシステムをはじめグループのIT企業が集結!
数多くのエンジニアが集まります。
-
スマホアプリから業務系システムまで
スマホアプリから業務系システムまで開発案件多数。システムエンジニア・プログラマーとしての多彩なキャリアパスがあります。
-
充実した研修制度
毎年、IT技術のトレンドや社員の要望に合わせて、カリキュラムを刷新し展開しています。社内講師の丁寧なサポートを受けながら、自分のペースで学ぶことができます。
-
資格取得を応援
スキルアップしたい社員を応援するために資格取得一時金制度を設けています。受験料(実費)と合わせて資格レベルに合わせた最大10万円の一時金も支給しています。
-
東証プライム上場企業グループ
オープンアップシステムは東証プライム上場「株式会社オープンアップグループ」のグループ企業です。
安定した経営基盤とグループ間のスムーズな連携でコロナ禍でも安定した雇用を実現させています。
株式会社オープンアップシステムに興味を持った方へ
株式会社オープンアップシステムでは、開発系エンジニア・プログラマを募集しています。
年収をアップしたい!スキルアップしたい!大手の上流案件にチャレンジしたい!
まずは話だけでも聞いてみたい場合もOK。お気軽にご登録ください。
新着案件New Job
-
開発エンジニア/東京都品川区/【WEB面談可】/在宅ワーク
月給29万~30万円東京都品川区(大崎駅) -
遠隔テストサービス機能改修/JavaScript/東京都港区/【WEB面談可】/テレワーク
月給45万~60万円東京都港区(六本木駅) -
病院内システムの不具合対応、保守/東京都豊島区/【WEB面談可】/テレワーク
月給30万~30万円東京都豊島区(池袋駅) -
開発/JavaScript/東京都豊島区/【WEB面談可】/テレワーク
月給50万~50万円東京都豊島区(大塚駅) -
債権債務システム追加開発/東京都文京区/【WEB面談可】/在宅勤務
月給62万~67万円東京都文京区(後楽園駅) -
PMO/東京都豊島区/【WEB面談可】/在宅勤務
月給55万~55万円東京都豊島区(池袋駅)