- 締切済み
DATE型とnullの比較
例えば以下のテーブルがあったとします。※年月日はDATE 従業員(ID,名前,勤務開始年月日,退職年月日) 退職していない従業員の退職年月日はnullが初期値として保持されます。このとき、例えば2009/2/10以前に退職した従業員情報をselectしたい場合 select * from 従業員 where 退職年月日 < 20090210 と実行した場合、null値は無視されて正常終了となりますか? select * from 従業員 where 退職年月日 < 20090210 AND 退職年月日 IS NOT NULL とする必要はありますか? 実行環境がないので教えてください。
- みんなの回答 (4)
- 専門家の回答
みんなの回答
- nfushi
- ベストアンサー率31% (39/122)
NULLは値ではありません。 退職年月日 < 20090210 の条件式は退職年月日がNULLの時に'unknown'を返します。 ですから AND 退職年月日 IS NOT NULL の指定は必要ありません。 なお退職年月日がDATE型ならば適切な処理で"20080210"を時刻型にする必要があります。 これはRDBMSにより仕様が違いますので割愛させていただきます。
- chukenkenkou
- ベストアンサー率43% (833/1926)
#2回答者です。追記します。 null値が検索対象になるかどうかは、#2での回答の通りです。 >select * from 従業員 where 退職年月日 < 20090210 date型に対する定数の指定は、お使いのRDBMSで正しいですか? 'yyyy-mm-dd'などの文字定数を、date型にキャストして変換してくれるRDBMSは多いと思いますが、数値での指定というのはあまり見たことがないので。
- chukenkenkou
- ベストアンサー率43% (833/1926)
null値は、等号や大小では比較ができない「不定な値」です。 >select * from 従業員 where 退職年月日 < 20090210 >と実行した場合、null値は無視されて正常終了となりますか? 標準SQLや主要なRDBMSでは、null値は検索対象となりません。 なお、Oracleでは「長さが0の文字列は、nullと等価」など、一部のRDBMSでは独自仕様を持っている可能性があるので、その点には注意してください。
- rinmane
- ベストアンサー率56% (64/113)
DBの種類やバージョンによって異なる可能性もありますが、 PostgreSQL8なら経験があるので、その条件で書きますね。 >select * from 従業員 where 退職年月日 < 20090210 select * from 従業員 where 退職年月日 < DATE '20090210' これなら大丈夫だと思います。 ただし、これだとNULLもヒットすると思うので、 select * from 従業員 where 退職年月日 < DATE '20090210' AND 退職年月日 IS NOT NULL にした方が良さそうです。 以上、ご参考になりましたら幸いです。