• ベストアンサー

文字例の比較について WHERE句

文字例の比較について、教えてください。 DELETE_FLAGという項目には、文字列の"1"、もしくはNULLが入っています。 セレクト文でDELETE_FLAGが"1"以外のものを抽出したいのですが、うまくいきません。 以下のSQL文を実行した際に、結果として5件ヒットしてほしいのですが、なぜか0件となってしまいます。 select count(product_id) from hpk_atoz_list_view where delete_flag != '1'; 原因わかりますでしょうか? よろしくお願いいたします。 ============================================================================ SQL> select delete_flag, product_id from product_list_view; DELETE_FLAG product_ID ---------------------------------   0002 1 1003   0002 1 1003   0002 1 1003   0002   0002 8行が選択されました。 SQL> SQL> select count(product_id) from product_list_view where delete_flag != '1'; COUNT(product_id) ---------- 0 SQL> SQL> select count(product_id) from product_list_view where delete_flag = '1'; COUNT(product_id) ---------- 3 SQL> SQL> select count(product_id) from product_list_view where delete_flag is not null; COUNT(product_id) ---------- 3 SQL> SQL> select count(product_id) from product_list_view where delete_flag is null; COUNT(product_id) ---------- 5 SQL> =====以上=====

質問者が選んだベストアンサー

  • ベストアンサー
  • dda167
  • ベストアンサー率76% (55/72)
回答No.2

ご自分で答えを出しておられるようですが…… NULLに比較演算子を適用しても決してTRUEには(FALSEにも)なりません。 以下のページが参考になるでしょう。 3値論理とNULL(http://codezine.jp/a/article/aid/532.aspx

MixNuts
質問者

お礼

ありがとうございます。 NULLについて、全く理解できていなかったようです。 教えていただいたサイトを参考にしたところ、意図した動作となりました。 貴重な情報、ありがとうございました。

その他の回答 (1)

  • yone_sk
  • ベストアンサー率34% (58/167)
回答No.1

DBは何をお使いでしょうか? delete_flag != '1' ⇒ delete_flag <> '1' これではダメですか?

MixNuts
質問者

お礼

DBはOracle10gです。 delete_flag != '1' ⇒ delete_flag <> '1' に変更しても結果は0件となってしまいます。

MixNuts
質問者

補足

あと、おかしなことに、「delete_flag != '2'」で行うと3件となってしまいます。 ============================================================== SQL> select count(product_id) from product_list_view where delete_flag != '2'; COUNT(product_id) ---------- 3 SQL> SQL> select count(product_id) from product_list_view where delete_flag = '2'; COUNT(product_id) ---------- 0 SQL>

関連するQ&A