アプリ版:「スタンプのみでお礼する」機能のリリースについて

初歩的な質問ですみません。
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
============================================================
よろしくお願いいたします。

A 回答 (3件)

delete_flagフィールドはNULL許可になっていて、'1'でないデータがNULLになっているのではないでしょうか?


だとすると・・・
select count(ID) from member_account where delete_flag<>'1' or delete_flag is null;
でいけるのでは?
    • good
    • 0

Oracleは久しく使っていないので自信はありませんが


delete_flagが空文字列('')かNULLになっているのではないですか?

select count(ID) from member_account where delete_flag is null
でどのような結果が返ってくるか確認してみてください。
    • good
    • 0

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データの検索は所詮索引を使えないので、実質的に問題ないと思います。
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!