• 締切済み

DATE型とnullの比較

例えば以下のテーブルがあったとします。※年月日はDATE 従業員(ID,名前,勤務開始年月日,退職年月日) 退職していない従業員の退職年月日はnullが初期値として保持されます。このとき、例えば2009/2/10以前に退職した従業員情報をselectしたい場合 select * from 従業員 where 退職年月日 < 20090210 と実行した場合、null値は無視されて正常終了となりますか? select * from 従業員 where 退職年月日 < 20090210 AND 退職年月日 IS NOT NULL とする必要はありますか? 実行環境がないので教えてください。

みんなの回答

  • nfushi
  • ベストアンサー率31% (39/122)
回答No.4

NULLは値ではありません。 退職年月日 < 20090210 の条件式は退職年月日がNULLの時に'unknown'を返します。 ですから AND 退職年月日 IS NOT NULL の指定は必要ありません。 なお退職年月日がDATE型ならば適切な処理で"20080210"を時刻型にする必要があります。 これはRDBMSにより仕様が違いますので割愛させていただきます。

回答No.3

#2回答者です。追記します。 null値が検索対象になるかどうかは、#2での回答の通りです。 >select * from 従業員 where 退職年月日 < 20090210 date型に対する定数の指定は、お使いのRDBMSで正しいですか? 'yyyy-mm-dd'などの文字定数を、date型にキャストして変換してくれるRDBMSは多いと思いますが、数値での指定というのはあまり見たことがないので。

回答No.2

null値は、等号や大小では比較ができない「不定な値」です。 >select * from 従業員 where 退職年月日 < 20090210 >と実行した場合、null値は無視されて正常終了となりますか? 標準SQLや主要なRDBMSでは、null値は検索対象となりません。 なお、Oracleでは「長さが0の文字列は、nullと等価」など、一部のRDBMSでは独自仕様を持っている可能性があるので、その点には注意してください。

  • rinmane
  • ベストアンサー率56% (64/113)
回答No.1

DBの種類やバージョンによって異なる可能性もありますが、 PostgreSQL8なら経験があるので、その条件で書きますね。 >select * from 従業員 where 退職年月日 < 20090210 select * from 従業員 where 退職年月日 < DATE '20090210' これなら大丈夫だと思います。 ただし、これだとNULLもヒットすると思うので、 select * from 従業員 where 退職年月日 < DATE '20090210' AND 退職年月日 IS NOT NULL にした方が良さそうです。 以上、ご参考になりましたら幸いです。

関連するQ&A

  • 【初歩】 SELECT文で意図した照会結果が得られない。NULLの扱いは?

    var1 var2 ------------- abc  null ------------- abc  null ------------- abc  null ------------- のようになっているテーブルに対して、 (1) select * from mytable where var1 = 'abc' (2) select * from mytable where var1 = 'abc' and var2 is null などとやれば、3件全部照会できますが、 (3) select * from mytable where var1 = 'abc' and var2 != '1' (4) select * from mytable where var1 = 'abc' and var2 != 1 とやっても1件も出てこないのですが、なぜでしょうか? 「NULLだって1ではない」わけだから、3件照会できてくれないと 困るのですが・・・

    • ベストアンサー
    • MySQL
  • 指定値を否定した条件で、NULLも含めた指定値以外を取得

    指定値を否定した条件で、NULLも含めた指定値以外を取得できる方法はありますでしょうか。 使用DBはMYSQLです。 test_table ID,name,value ----------- 1,aaa,100 2,bbb,NULL 3,ccc,300 4,ddd,100 5,eee,NULL SELECT * FROM test_table WHERE value = 100; valueが100のもの、ID:1,2を取得していたのですが、 100以外のものを取得する必要がでてきました。 SELECT * FROM test_table WHERE NOT(value = 100); こうすると、ID:3しか返ってきません。 valueがNULLのものも含めて取得したいのです。 NULLの値があることを考慮すれば、以下のような形で取得はできるのですが、 SELECT * FROM test_table WHERE NOT(value = 100) AND value IS NULL; value = 100という条件に、NOTをつけるかつけないかのような簡単な方法でNULLまで取得したいのです。 実はコーディング中に悩んでいるのですが、 動的ページなため、WHERE条件が定まらないのとかなりの数になります。 当初の予定では、全ての条件を()で囲んでNOTをつけるだけにするつもりでした。 これができないとなると、一つ一つ条件を見てNOTを付加+IS NULLの条件追加をしないといけなくなりそうです。 なにか良い方法がありましたらご教授願います。

    • ベストアンサー
    • MySQL
  • テーブルで使用するinについて

    select count(r.テスト1) as all_count from DB1 as r where 1=1 and ( r.テスト1 in (select distinct テスト1 from DB2 where テスト1 is not null and テスト2 is not null)); このようなSQL文がある場合は どのような意味になるのでしょうか? inといものはどのようなときに使うのでしょうか? ご教授お願いいたします。

  • sqlplusの処理が途中でとまる

    oracle10gを使用しています。 sqlplusでいくつかのDDLとDMLを一度にコピーペーストで流しました。一つ一つの処理後にcommit;も入っています。 しかし、最後のDMLで処理がとまってしまい、エラーもでません。内容は以下のようになっています。 insert into tbl_a (select distinct col1,'2006/01/01' from tbl_b where col1 is not null union select distinct col2,'2006/01/01' from tbl_b where col2 is not null union select distinct col3,'2006/01/01' from tbl_b where col3 is not null union select distinct col4,'2006/01/01' from tbl_b where col4 is not null union select distinct col5,'2006/01/01' from tbl_b where col5 is not null union select distinct col6,'2006/01/01' from tbl_b where col6 is not null); COMMIT; この処理を単独で実行すると、成功します。sqlpulsは、実行コマンドの量に制限などあるのでしょうか?なぜ、このようになるかわかりません。ちなみに、コマンドの全文字数は3990目で、処理が停止するのは、3648文字目です。この3648文字目にあたるのが、上記の >select distinct col3,'2006/01/01' の >select disti です。 大変急を要ししています。 よろしくお願いします。

  • ACCESS:Nullの扱い

    次のようなSQLがあります。 SELECT 住所.住所, 住所.備考 FROM 住所 WHERE (((住所.住所) Not Like "*佐賀県*")); 住所のフィールドにNullがありますが抽出されません。 WHERE (((住所.住所) Not Like "*佐賀県*")) OR (((住所.住所) Is Null)); とすると思い通りの結果になるのですが、なぜNullは「"佐賀県"を含まない」には含まれないのでしょうか。

  • DB2のSQL

    select * from xTABLE where EMP_ID = "P001" というSQLを実行すると SQL0206N "P001" is not valid in the context where it is used. SQLSTATE=42703 のエラーが出ます。 SQLSTATEで調べても「"P001"の列がテーブルにない」ということみたいですが 列名で捉えている時点でおかしい気がします select * from xTABLE where EMP_ID = null のSQLは正常にテーブルのSELECT結果が返ってきます。 どうすればよいでしょうか?

  • MySQLでの集計

    いつもお世話になっております。MySQLを利用しておりまして質問です。 同じ構成のテーブルが5つあり、選択されたテーブルを集計するSQLを作成しています。 カラムを簡単に構成を書くと ID、名前、ステータス1、ステータス2 のような形です。 テーブル1、2、3が選択された場合 テーブル1と2でIDの重複のない一覧を作成し、IDが被っていた場合はステータスをそれぞれ大きいほうを保持するようにします。 そして次にテーブル1、2を合わせたテーブルとテーブル3で同じように集計をしたいのですが、ここがうまく出来ません。 実際の環境ではなく簡素化したものなのでおかしな点があるかもしれませんがこのようになっています。 SELECT TTT1.id,TTT1.名前,TTT1.st1,TTT1.st2 FROM(     SELECT id,名前,ステータス1 as st1,ステータス2 as st2     FROM(        SELECT *        FROM テーブル1 T1        WHERE T1.id NOT IN(SELECT T2.id FROM テーブル2 T2)        UNION All        SELECT *        FROM テーブル2 T2        WHERE T2.id NOT IN(SELECT T1.id FROM テーブル T1)     ) as TT1     UNION     SELECT id,名前,st1,st2     FROM(         SELECT T1.id,T1.名前,         (CASE T1.ステータス1 or T2.ステータス1 WHEN "2" THEN "2" WHEN "1" THEN "1" WHEN "0" THEN "0" ELSE null END) as st1,         (CASE T1.ステータス2 or T2.ステータス2 WHEN "2" THEN "2" WHEN "1" THEN "1" WHEN "0" THEN "0" ELSE null END) as st2,         FROM テーブル1 T1,テーブル2 T2         WHERE T1.id = T2.id AND NOT(T1.st1 IS null AND T1.st2 IS null AND T2.st1 IS null AND T2.st2 IS null) ) as TT2 )as TTT1 /* UNION ALL SELECT id,名前,st1,st2 FROM (TTT1とテーブル3を比較したもの)as TTT2 */ /**/で囲ったところでTTT1が呼び出せれば、テーブル1のところをTTT1にし、テーブル2をテーブル3にすれば出来ると思うのですが、そういうことは無理なのでしょうか? また集計するテーブルの数が不特定なので一つずつ集計をする形を取りましたが、 もっとこういう風にやればいいと言う方法はございますでしょうか? よろしくお願いいたします。

    • ベストアンサー
    • MySQL
  • is null のandについて(日付型)

    SQLのSELECTで困っています。 プロシージャに引数を渡してSELECTしようと考えています。 複数の日付(datetime)型の引数をand条件で結びたいです。 検索したくない場合はnullを渡す。 例) select A,B,C from XXX where A = '1' and (B = 引数 or 引数 is null) and (C = 引数 or 引数 is null) and (D = 引数 or 引数 is null) ===== B,C,D はdatetimeです。 この形ですと、B,C,D全ての引数に日付が入っていれば取得できる のですが一箇所でも引数に何もセットしないと値0件で帰ってきて しまいます。 せっかく(is null)を使用しているのに意味がありません。 良いお知恵は無いでしょうか。 よろしくお願いします。

  • nullと文字数について

    いつもお世話になっています。 select 項目1 from テーブル where 項目1 is null or length(項目1)>=0 質問1 上記SQLを作成した場合、全レコードが抽出されるのでしょうか? 疑問1 (1)項目1が空白一つの場合、length(項目1)>=0となる? (2)nullと空文字の違いがいまいちわからない。 以上、よろしくお願いします。

  • Nullを含む条件の検索

    Nullを含む条件の検索 Oracle10g利用して勉強中の初心者です。 Hinテーブル NO Hin Flg 1 卵 1 2 鯉 null 3 糸 0 SELECT * from Hin Where not Flg = 1 としてFlgが1以外のレコードを取得したいのですが Nullは判断しなくて困っています、 良い方法は無いでしょうか? よろしくお願いします。