- ベストアンサー
文字例の比較について 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> =====以上=====
- みんなの回答 (2)
- 専門家の回答
質問者が選んだベストアンサー
ご自分で答えを出しておられるようですが…… NULLに比較演算子を適用しても決してTRUEには(FALSEにも)なりません。 以下のページが参考になるでしょう。 3値論理とNULL(http://codezine.jp/a/article/aid/532.aspx)
その他の回答 (1)
- yone_sk
- ベストアンサー率34% (58/167)
DBは何をお使いでしょうか? delete_flag != '1' ⇒ delete_flag <> '1' これではダメですか?
お礼
DBはOracle10gです。 delete_flag != '1' ⇒ delete_flag <> '1' に変更しても結果は0件となってしまいます。
補足
あと、おかしなことに、「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>
お礼
ありがとうございます。 NULLについて、全く理解できていなかったようです。 教えていただいたサイトを参考にしたところ、意図した動作となりました。 貴重な情報、ありがとうございました。