NULLを認識させる方法

このQ&Aのポイント
  • Access2000を使用しています。SQL文について質問です。
  • AとBの内容が似たテーブルがあります。それぞれの'数量'フィールドを比べ、一致する件数を出力したいという目的です。
  • IS NULLやIS NOT NULLを使ってもTRUEかFALSEが渡ってしまいます。COUNTを使ってデータが一致しないところがNULLであることを認識させ、カウントからはずすにはどのようにSQLを作成すればよいでしょうか?
回答を見る
  • ベストアンサー

NULLを認識させる方法

Access2000を使用しています。 SQL文について質問です。 AとBの、内容が似たテーブル (フィールド項目は全く同じで入力内容が若干違います) それぞれの'数量'というフィールドを比べ、 内容が一致する件数を出力したいというのが目的です。 方法としてはCOUNTを使用し、 (A.数量)(B.数量)を結合&比較して一致しないレコードが NULL意外のものを件数に数えるようにしたいのです。 しかしIS NULLやIS NOT NULLを使うとTRUEかFALSEが 渡ってしまいます。 そこで質問なのですが、 COUNTを使って、 データが一致しないところがNULLであることを認識させ、 カウントからはずすには、どのようにSQLを作成したら よいでしょうか?

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

  • ベストアンサー
  • noah7150
  • ベストアンサー率46% (116/251)
回答No.1

キーワードとしては Nz関数 IIf関数ってところでしょうか select Count(*) from TBL1 inner join TBL2 on TBL1.KEYCOL = TBL2.KEYCOL where TBL1.SURYO <> TBL2.SURYO and TBL1.SURYO IS NOT NULL and TBL2.SURYO IS NOT NULL が普通に考えるところでしょうかねぇ DB上のNullは扱いが少し特殊になります 演算中にNullがあると答えがNullになったりしますので 変わった方法も select Sum(IIf(TBL1.SURYO IS NULL,1,0)) AS TBL1数量Null件数, Sum(IIf(TBL2.SURYO IS NULL,1,0)) AS TBL2数量Null件数, Sum(IIf(TBL1.SURYO = TBL2.SURYO,1,0)) AS 数量一致件数, Sum(IIf(TBL1.SURYO <> TBL2.SURYO,1,0)) AS 数量不一致件数 from TBL1 inner join TBL2 on TBL1.KEYCOL = TBL2.KEYCOL こんな使い方も出来ます 条件に合えば1、合わなければ0を返すIIfを書いてそれをSumすると 条件に合う件数が分かる

その他の回答 (1)

  • nda23
  • ベストアンサー率54% (777/1415)
回答No.2

>内容が一致する件数を出力したいというのが目的です。 これとNULLを認識させる方法とは話が別なのでは? 例えば、数量別にA側の件数とB側の件数の合計が知りたいなら 次のようなSQLになります。 SELECT X.数量,X.件数 + Y.件数 AS 件数 FROM (SELECT 数量,COUNT(*) AS 件数 FROM A GROUP BY 数量) AS X INNER JOIN (SELECT 数量,COUNT(*) AS 件数 FROM B GROUP BY 数量) AS Y ON X.数量=Y.数量 一致しないものの件数なら、ON句の条件式を<>にします。 SQLでは常に件数を絞り込む方向にしないと処理速度が悪くなります。 総当たりした結果、相手側がNULLのものを数えるより、一致するものを 抽出してから件数を数える方が、一般にずっと高速です。

関連するQ&A

  • NULLを含む文字列の結合で困っています。

    いつもお世話になっています。 VB.NET2003+Access2000環境です。 まず前提として、このデータベースにはユニークなフィールドがありません。(残念ながらこちらの都合では変更することはできません) 従って今まではAccessのクエリウイザードを使って文字列を結合(フィールドを結合)して、ユニークなキーを作っていました。 これを今回、VB.NETで動いているアプリの中にボタンを作り、そこからcsvファイルにエクスポートさせるような仕掛けを作ろうとしました。 ところが、あるフィールドがデータが存在したりNULLであったりするため、結合するとNULLになるデータが出現してきます。 (Accessでは結合時、NULLは無視されていたようで影響はありませんでした) これでは検索して絞り込むキーには出来ず、Accessと同じ結果が得られません。 SQL文では(というかデータアダプターに読み込ませるクエリデザイナ作成時に)どういう風に記述すればNULLがあっても区別出来るようになるのでしょうか? 簡単に言えば フィールドA と フィールドB ともにテキストタイプのデータで、BのみNULLもあり得る場合、  select a, b, a+b as tempAB from tableC というSQL文を実行した結果、tempAB が NULL だけにならない方法をご教示ください。 SELECT CASE when~end などをいろいろ試してみましたがダメでした。 よろしくお願いいたします。

  • ORACLEでの件数カウント方法

    素人なので教えてください。sqlplusでレコード件数をカウントしたいのですが、チョット特殊なカウント方法なのです。やりたいことは、一回のSQL文で複数カラムのレコード件数をカウントしたいのですが可能でしょうか? 例) a_cdの件数カウントの場合は、 select a_cd,count(*) from abc group by a_cd; で b_cdの件数カウントの場合は、 select b_cd,count(*) from abc group by b_cd; これを一回のSQLで、 a_cdとb_cdの件数をカウント出来ますか?

  • group by  0とnull値は、平均値の計算から省きたい

    行ないたいこと group by avgのSQLで、0とnull値は、平均値の計算から省きたい 各フィールドの平均値を出力したいのですが、 0とnullの値は、平均値の計算から省いて計算する必要があります。 (分母にカウントしません) 平均値を求めるフィールドが、1つだけなら、条件式を作成することが出来たのですが、同時に3つのフィールドの計算を求める必要があります。 環境:oracle10 -table hoge 日付, a , b, c 5/4 200,null,50 5/5 200,100,0 5/6 200,null,100 期待する値(各フィールドの平均値、だたし0とnullは分母から除外) a = (200+200+200)/3 = 200 b = 100/1 = 100 c = (50+100)/2 = 75 質問1. このようなSQLは実現可能でしょうか? 質問2. 実現可能であれば、ご教示いただきたいのですが… よろしくお願いいたします。

  • 特定のフィールドにデータが入ってる件数を調べたい

    ageというフィールドにデータが入っている件数を調べたいのですが、どのようなsql文を書けばいいでしょうか。 ageフィールドのNULLは「いいえ」、デフォルト値は「空欄」です。 $sql = "SELECT COUNT(*) AS cnt FROM table where 'age' is not null ;"; この文ではうまくいきませんでした。ageフィールドのデフォルト値をNULLにすればいいのでしょうか?

    • ベストアンサー
    • MySQL
  • 特定のフィールドにデータが入っている件数を表示したい

    ageというフィールドにデータが入っているものだけを抽出してその件数を表示したいのですが、どのようなsql文を書けばいいでしょうか? ageフィールドは、種別「varchar(255)」、NULL「いいえ」、デフォルト値「空欄」になっています。 $sql = "SELECT COUNT(*) AS cnt FROM table where 'age' is not null;"; これではうまくいきませんでした。ageのデフォルト値をNULLにすれば解決するのでしょうか?

    • ベストアンサー
    • MySQL
  • AccessにおいてフィールドがNULLの値を0に変換するには

    下記のようなSQLで件数を取得したいと考えています。 テーブルBの件数がNULLの場合、差がNULLになってしまいます。 このような場合、差を0にしたいです。 どのように修正したらよいでしょうか。 SELECT A.ID, (A.件数-B.件数) AS 差 FROM A LEFT JOIN B ON A.ID = B.ID;

  • 選択クエリーで 2つのテーブルの項目が Null どうしのデータを抽出するには?

    初心者です、教えてください。 テーブルが、2つあって テーブル名: T1 T2 フィールド1: A1 B1 フィールド2: A2 B2 フィールド3: A3 B3 とあった時、選択クエリーで T1 と T2 のフィールドの A1-B1、A2-B2、A3-B3 が、 一致したものを表示するクエリーを作成します。 でも、A2、A3、B2、B3のデータ中には、それぞれ Null値が入っていて、 A2-B2、または、A3-B3 が、Nullどうしなら、一致とみなして、表示するには、 どうしたらいいのでしょうか? Nullのみどうしのデータで、Nullのフィールドを 除いた選択クエリーをつくって、あとで合わせてもいいのですが、 実際のテーブルは、そういうフィールドが、いっぱいあって、大変なんです。 簡単に表示する方法は、あるでしょうか? 初心者なのでむずかしいことは、 やったことがなくて、すいませんが、わかる方がいらっしゃたら、お願いします。

  • 不一致クエリでnullまで抽出されてしまいます

    質問です。 現在、accessにて不一致クエリを使用し、テーブルAをチェックし、 マスタテーブルに無い情報が書かれてしまっているフィールドがある場合 抽出して確認をする、というクエリを作りたいと考えています。 不一致クエリにて自動で入る「is null」を使用すると マスタテーブルに無い事が書いてあるレコードは抽出するのですが (逆になぜis nullで相違するレコードが抽出されるのか理解に苦しんでもいるのですが) is nullですので、nullのレコードも抽出されてしまいます。 抽出条件として、マスタテーブルと相違するもの&nullは抽出しない、としたいのですがお知恵を拝借出来ませんでしょうか。 よろしくお願いいたします。

  • nullと同じく空白をCountしない方法は?

    お世話になります。 mysql 超初心者です。 Count( a) AS b FROM tblで aをCountするのはnull値以外で空白もCountしてしまいます。 これを空白もnull値と同じにCountしない方法はどうするのでしょうか? または空白のみをCountする書き方等あるのでしょうか? 色々調べてもググってもよくわかりませんでした。 初期値のnull値が一回書き込まれたデーターを削除すると 空白になってCount( a) でCountされて困っています。 初心者なのでなるべく具体的な回答をお待ちしています。 どうかよろしくお願いいたします。

    • ベストアンサー
    • MySQL
  • null→数値にするには?

    何度も質問してすみません。 NULLが格納されているフィールドに 「0」や「1」といった値を入れる為には どういうINSERT INTO文をPHP内で記述すれば宜しいでしょうか? pg_field_is_nullを使ってみたのですが イマイチ値を変更する事ができません。 また、SQL文で「NOT NULL制約」という言葉があるのを知ったのですが、 ALTER TABLE文でテーブルを作る時に、 各フィールドにはnullではなく、「0」を最初から格納したい場合は どういった記述をすれば宜しいでしょうか? 宜しくお願い致します。