DB2は、NOT NULL 列に対して空値が入ります。DB2の仕様ですね。他のDBは知らんです。 NULLと空値は、別ものとして扱われますので注意が必要です。
テスト用のテーブルを作ってみる。
$ db2 "create table test.tab1 (id char(2) not null,detail char(20) not null)" DB20000I SQL コマンドが正常に完了しました。
両方に''(空値)を設定してみる。
$ db2 "insert into test.tab1 values('','')" DB20000I SQL コマンドが正常に完了しました。
両方文字を入れてみる。
$ db2 "insert into test.tab1 values('01','1234567890')" DB20000I SQL コマンドが正常に完了しました。
これは、エラーになります。
$ db2 "insert into test.tab1 values(NULL,'1234567890')" DB21034E コマンドが、有効なコマンド行プロセッサー・コマ ンドでないため、 SQL ステートメントとして処理されました。 SQL 処理中に、そのコマンドが返されました。 SQL0407N NULL 値の NOT NULL 列 "TBSPACEID=3, TABLEID=18, COLNO=0" への代入は許されていません。 SQLSTATE=23502
余談ですが、DB2には、
COALESCE
という関数がございます。詳しくは、 http://publib.boulder.ibm.com/infocenter/dzichelp/v2r2/index.jsp?topic=/com.ibm.db29.doc.sqlref/db2z_bif_coalesce.htm
あたりを参照いただくとして、ようは、下記通り、
SELECT * FROM GRADES WHERE COALESCE(SCORE1,0) + SCORE2 > 100;
※SCORE1が、NULLの場合は、0 (ZERO)として評価するみたいな感じの時に利用できます。集計を行うときなんかに重宝するかもしれません。(まあ、NULLを許可している。数値カラムがある時点で問題といえば問題ですが。。)