SQL ServerはNULLが許容されているデータベースです。NULLは便利な反面、アプリケーションサイドとの兼ね合いで、空白スペースなどに置き換える場合も多々あります。SQL ServerではNULLに関する命令として、IS NULL演算子とISNULL関数が準備されています。IS NULL演算子はNULLの判定に利用されますし、ISNULL関数はNULLを他の文字列に置き換える際に利用します。ここで、両者の具体的な使い方などを確認していきましょう。, IS NULL演算子とは、NULLかどうかを判定するために利用する演算子です。主にWhere条件で利用することが多くなるかと思います。, アプリケーション開発の現場で、テーブルにNULLのデータが含まれているかの確認はよくあることです。もちろん、NULL以外のデータの確認もあるでしょう。IS NULL演算子はNULLが利用できるデータベースでは基本的な使い方ですので、早めに使い方はマスターしておきましょう。, 使い方は非常に簡単です。まずはNULLのデータを取得する方法を解説します。  is null:1件(Oracleは2件) 可能な重複: なぜOracle 9iは空の文字列をNULLとして扱いますか? 私はOracle 10gにTEMP_TABLEという名前のテーブルを持っています(デモ用のidとdescriptionだけです)。. What is going on with this article? sqlにおける null という概念について改めて考える機会があったので、 その内容についてまとめさせていただきました。 結論から言うと、 どうしても必要な場合を除いて、可能な限りNULLは使用すべきではない という内容になっています。 By following users and tags, you can catch up information on technical fields that you are interested in as a whole, By "stocking" the articles you like, you can search right away. 一度私的にまとめておこう、という判断から両DBのnullと空文字の扱い方について実験・整理する。結論は下記のようになる。 SQL Serverはnullと空文字は別物扱い。 Oracleはnullと空文字はnull扱い。 検証環境 SQL Server 2005とOracle 10g環境で動作確認を行った。主キーでない…  = '': 0件 先ほどと同じテーブル情報をもとに、NULLの項目を指定の文字列に置換しましょう。, NULLが’置換’に変換されています。 Help us understand the problem. you can read useful information later efficiently. 私はOracle 10gにTEMP_TABLEという名前のテーブルを持っています(デモ用のidとdescriptionだけです)。, 列idは、 NUMBER(35, 0) not null型ではNUMBER(35, 0) not null 、列DESCRIPTIONがVARCHAR2(4000) not null型のシーケンス生成プライマリ・キーです。, このテーブルを作成した後、次のINSERTコマンドを交互に挿入しようとしています。, not null制約がDESCRIPTION列に適用されているため、どちらも明らかではありnot null 。, DESCRIPTION列にnot null制約を落とした場合、基本的なテーブル構造は次のようになります, 指定された両方のINSERTコマンドが成功します。 彼らは、 TEMP_TABLE DESCRIPTION列に空の文字列''を持つ2つの行を1つはnull値で作成し、もう1つは作成します。, 一方がnull値を持ち、もう一方がDESCRIPTION列に空の文字列''持つ両方の行をフェッチします。, おそらく、Oracleはnull値と空の文字列を別々に扱いますが、 null値と空文字列''両方が挿入されないINSERT文ではそうではないようですnot null制約を持つ列 それはなぜそうですか?, oracleでは、空のvarchar2とnullは同じように扱われ、あなたの所見にはそのことが示されます。, 真実とは決して決してならないので、行を返すことはありません。 挿入にも同じですが、NOT NULLはnullまたは空の文字列を挿入できないことを意味します(nullとして扱われます), これは、Oracleが空の文字列をNULL値に内部的に変更するためです。 Oracleは単純に空の文字列を挿入しません。, 空の文字列を格納する 'description'フィールドにダミー値を使用します。 (つまり、実際のデータがそのような記述値に決して遭遇しないと仮定して、フィールドを 'rocks'に設定する). -- NULLだったら空文字に置き換えて比較 select * from Users where user_name not in (select case when user_name is NULL then '' else user_name from Angels); そもそも、angel_nameがNOT NULLならこんなことを考えなくていい。謎の天使、禁止。ちゃんと名前を確定させてください。 X-LAWS つまり、PostgreSQLでは空文字("")とnullは別の値として扱われます。 そのため、システムが使用するDBをOracleからPostgreSQLに変更する場合は、その違いを意識してSQLを修正する必要があります。 列idは、 NUMBER(35, 0) not null型ではNUMBER(35, 0) not null 、列DESCRIPTIONがVARCHAR2(4000) not null型のシーケンス生成プライマリ・キーです。  = '': 1件(Oracleは0件) Apache Camel/VoltDB/Oracle/Apache karaf。 sql serverではnullに関する命令として、is null演算子とisnull関数が準備されています。is null演算子はnullの判定に利用されますし、isnull関数はnullを他の文字列に置き換える際に利用します。ここで、両者の具体的な使い方などを確認していきましょう。 Copyright © InformationPort Co.,Ltd. Oracleは、他のDBMSと比べるとNULLの扱いが特殊です。空文字をNULLとして処理する点やNULLに10を加算してもNULLになる点など、知らなければハマってしまいますよね。 Oracleの公式ドキュメントにも「Oracle Databaseは、長さがゼロの文字値をNULLとして処理します。 となります。, 以下のように検索すると検索すると Why not register and get more from Qiita? ISNULL関数を使用してデータを取得する際には、AS句で項目に名前をつけましょう。つけていなかったら「(列名なし)」となってしまい、不具合の原因になる恐れもあります。, IS NULL演算子は、NULLかどうかを判定する際に利用する演算子で、ISNULL関数は、NULLを指定の文字列に変換する関数です。使い方も非常にシンプルですし、SQL自体はどこの開発現場でも必ずと言っていいほど利用されている言語ですので、積極的に活用して早く自分のものにしましょう。, .NET分野でのキャリアアップをお考えの方は、現在募集中の求人情報をご覧ください。. 4つ目のポイントは,null値の四則演算の結果はnullになることだ(同(4))。nullに対する足し算,引き算,掛け算,割り算の結果はすべてnullになる。5つ目のポイントは,sql関数の引数にnullを指定すると関数の戻り値はnullになることである(同(5))。 つまり、PostgreSQLでは空文字("")とnullは別の値として扱われます。 以下のテーブル情報をもとに検索します。, 使い方はとてもシンプルだということを確認できたかと思います。他の条件と組み合わせて早速使ってみましょう。, データベースではNULLが許容されていても、アプリケーションサイドではNULLのためにシステム障害が発生することはよくあります。このようなエラーを起こさないよう、データベースサイドでISNULL関数を利用して、NULLを指定の文字列に置き換える処理を実装することも、SQLプログラミングのひとつです。, こちらも使い方は非常に簡単です。 Oracleでは自動的に空文字("")を nullに変換しますが、PostgreSQLではnullに変換しません。 となります。, PostgreSQLでOracleと同じ結果を得るためには以下のようなSQLとなります。, SIer&バックエンドエンジニア&日曜プログラマー。  is not null: 1件 Oracle でよく使って ... 空文字にする場合は、「0」のところを「”」シングルクォーテーション2つにすればOK。 ... 各データベースにおけるSQLでNullの置き換えをまとめました。 基本的に仕事外での自分用のメモ(興味があること)として記事を書いています。. All Rights Reserved. そのため、システムが使用するDBをOracleからPostgreSQLに変更する場合は、その違いを意識してSQLを修正する必要があります。, 実際にどのような動きをするか、Oracle、PostgreSQLの場合それぞれで試してみます。, 以下のように検索すると  is not null: 2件(Oracleは1件)  is null:2件