• ベストアンサー

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 ============================================================ よろしくお願いいたします。

  • Oracle
  • 回答数3
  • ありがとう数10

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

  • ベストアンサー
  • 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 でどのような結果が返ってくるか確認してみてください。

関連するQ&A

  • 文字例の比較について 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> =====以上=====

  • InformixのSQL文Where句で

    マイナーなRDBS(?)なので回答をいただけるか不安ですが… InformixのSQL文(単純なSELECT文)で、以下のような 文の場合、検索条件はどのような解釈になるのでしょうか? select  count(*) from  テーブル名 where  カラム名 = ? です。 要は「?」が何を示すのかが分からないのです。 matches(Oracleでいうlike)の場合、Oracleの%が*に、 _(アンダースコア)が?になるらしいのですが、 = で完全一致で繋いださいにどうなるのかが分かりません。 ちょっとした情報でもよいので、ご教授お願い致します。

  • Oracle SQLの、where句内の条件文について教えてください。

    Oracle SQLの、where句内の条件文について教えてください。 下記SQLの(1)と(2)の記述文を教えてください。 (1)例:owner = sys,admin ownerがsysまたは、adminを抽出 (2)例:column_name = '*aaa*' column_nameに「aaa」が含まれているデータ SELECT owner, table_name,column_name FROM all_tab_columns WHERE (1)(Ownerを複数指定)   and (2)(column_nameに、●●が含まれるデータ)

  • 【Transact-sql】 execの結果をoutputパラメータに持たせたい

    タイトルの通り、execの結果をoutputパラメータに持たせたいのですが、 どうすればご存知の方、ご教授お願いします。以下のように、count(*)の結果を持たせたいです。以下にサンプルコードを記載しました。 ---ストアドabc--- ( @aWork int output, @bWork int output, @cWork int output, @IDs varchar ) declare @Sql1 varchar(500) declare @Sql2 varchar(500) declare @Sql3 varchar(500) declare @IDs varchar(500) set = '1,2,3' set @Sql1 = 'select count(*) from a where id = ' + IDs -- @aWork = exec(@Sql1)としたい exec(@Sql1) set @Sql2 = 'select count(*) from b where id = ' + IDs -- @bWork = exec(@Sql2)としたい exec(@Sql2) set @Sql3 = 'select count(*) from c where id = ' + IDs -- @cWork = exec(@Sql3)としたい exec(@Sql3)

  • SQL文について困っています

    ID(NUMBER型)と NUM(NUMBER型)と nenngetu (date型)を持ったテーブルAAAから、 ID=1000 のなかで日時が一番古い処理NOをselectするSQL文を書きましたが上手く実行されません。 select NUM from AAA where nenngetu = (select min(nenngetu) from AAA) and ID=1000; ID=1000の条件をはぶき、 select NUM from AAA where nenngetu = (select min(nenngetu) from AAA); でしたら、実行できました。 oracleで実行しようとしています。 どなたか、書き方を教えてください。

  • このSQL文の意味を教えてください。

    SQL勉強中の者です。このSQL文の意味を教えてください。 SELECT A.* FROM table AS A, table AS B WHERE A.id *= B.id AND A.flag = 1 tableにAとBという別名をつけて、Aの全ての項目を抽出しているというところまでは分かりました。 分からないのは「WHERE A.id *= B.id」の部分です。ただの「=」なら分かりますが「*=」って何ですか? あと、AとBのテーブルが同じなのですが、同じテーブルを2つ並べている意味がよく分かりません。 よろしくお願いします。

  • SQL文で困っています。

    ID(NUMBER型)と NUM(NUMBER型)と nenngetu (date型)を持ったテーブルAAAから、 ID=1000 のなかで日時が一番古い処理NOをselectするSQL文を書きましたが上手く実行されません。 select NUM from AAA where nenngetu = (select min(年月) from D_KR_SAP_IFRIREKIKANRI) and ID=1000; ID=1000の条件をはぶき、 select NUM from AAA where nenngetu = (select min(年月) from D_KR_SAP_IFRIREKIKANRI); でしたら、実行できました。 oracleで実行しようとしています。 どなたか、書き方を教えてください。

  • SQL文について

    テーブルの結合について教えてください。 (DBはオラクルです) select * from table1,table2 where table1.カラム名=table2.カラム名; で、結合が出来ることは分かりました。 やりたいことはテーブルの結合と、ある期間のデータを持ってきたいのです。 select カラム名 from table1 where カラム名 between '20020213' and '20020218'; で期間を決めて引き出すやり方も分かっています。 一度に結合と期間を決めて引き出すやりかたってどうすればよいですか? それとも不可能ですか? 教えてください。

  • シェルでSQLの結果を取得したい

    シェルスクリプトでSQLPLUSから、SQL文を実行させる事はできたのですが、そのSQLがSELECT文の時、その抽出した結果をシェルスクリプト上 、知りたいとき、どのようにすればわかりません。 SELECT した結果は必ず0個または1個です。 どなたかご教授ください。 sqlplus -S user/pass @${SQL_FILE} << EOF >log.txt EOF SQL_FILEの中身 select seq from A_table where ID = 1

  • SQL文の実行速度について

    こんにちは。SQLを勉強しています。 質問をさせてください。 Oracleテーブル(test_table:レコード数はかなりあると考えて構いません) にnumber(int),value(varchar), code(varchar)の3つのフィールドが存在 するとします。 今、codeを指定してvalueを取得したいと考えています。 (1)---------------------------- select value from test_table where code='001'; select value from test_table where code='002'; select value from test_table where code='003'; (2)---------------------------- select code, value from test_table where code='001' or code='002' or code='003' (1)と(2)ではどちらが実行速度が速いのでしょうか? 実際に実行すればわかることですが、そういった環境が ないので、確認できません。宜しくお願い致します。