• ベストアンサー

SQL WHERE文のノットイコールについて

初歩的な質問ですみません。 Oracle9iでsqlplusで接続しています。 「member_accountテーブルのdelete_flag(VARCHAR2)カラムの値が'1'ではない」ものを抽出したいと考えてます。 ただ、正しい結果が返ってきません。 何が問題でしょうか?よろしくお願いいたします。 ============================================================ SQL> select count(ID) from member_account; COUNT(ID) ---------- 16450 SQL> SQL> select count(ID) from member_account where delete_flag='1'; COUNT(ID) ---------- 107 SQL> SQL> select count(ID) from member_account where delete_flag<>'1'; COUNT(ID) ---------- 0 SQL> SQL> select count(ID) from member_account where delete_flag!='1'; COUNT(ID) ---------- 0 ============================================================ よろしくお願いいたします。

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

  • ベストアンサー
  • reset_cat
  • ベストアンサー率68% (94/138)
回答No.1

delete_flagフィールドはNULL許可になっていて、'1'でないデータがNULLになっているのではないでしょうか? だとすると・・・ select count(ID) from member_account where delete_flag<>'1' or delete_flag is null; でいけるのでは?

すると、全ての回答が全文表示されます。

その他の回答 (2)

回答No.3

nullが原因だと思うので、#1で書かれているように、nullを意識した条件式を使うか、 人間的条件解釈に近いdecode式やcase文を使うと良いと思いますよ。 たとえば、 select count(*) from member_account where decode(delete_flag,'1',1,0) = 0; や select count(*) from member_account where case when delete_flag='1' then 1 else 0 end = 0; は、16343を戻すはずです。 ちなみに、関数式を条件にすると、通常は索引が無効になりますが、 nullデータの検索は所詮索引を使えないので、実質的に問題ないと思います。

すると、全ての回答が全文表示されます。
  • don9don9
  • ベストアンサー率47% (299/624)
回答No.2

Oracleは久しく使っていないので自信はありませんが delete_flagが空文字列('')かNULLになっているのではないですか? select count(ID) from member_account where delete_flag is null でどのような結果が返ってくるか確認してみてください。

すると、全ての回答が全文表示されます。

専門家に質問してみよう