2011-06-17 11 views
1

これに従うと、それは本当に明白で簡単です。何らかの理由で、結果はデー​​タサブセットのクエリとアプローチ角度によって異なります。フィールドcorrect_addrは、許容可能なヌルを持つchar(1)フィールドであることに注意してください。Informix SQL - 単純な選択クエリが予期しない結果を返す

select distinct correct_addr, count(*) from id_rec group by correct_addr; 

correct_addr  (count(*)) 
         2477 
N       80 
Y      84013 

3 row(s) retrieved. 

オクラホマので、correct_addrは、3つの異なる値が含まれています

select count(*) from id_rec where correct_addr <> 'N'; 

     (count(*)) 
      84013 
: "N"、 "Y" を、そして "" または "" または NULL

はだから今、私はこのしてみてください

空白の値を持つ2477レコードにはどうなりましたか?

もう一つは、別の角度から試してみてください。

select count(*) from id_rec where correct_addr in (null,'',' ','Y'); 

     (count(*)) 
      84013 

同じことがだから何がここで起こっている....

をどうなりますか? SQLエンジン(?)が最後の2つのSQL文で空白の値を認識しないのはなぜですか?それは、最初のクエリではグループ分けでうまく発見されますが、それ以外はどこにもありません。

このタイプのことが起こる理由は誰にもありますか?

答えて

3

NULLsでは、SQLで特別な処理が必要です。

select count(*) 
from id_rec 
where correct_addr <> 'N' 
    or correct_addr is null; 

See here for an explanation of handling NULLsを試してみてください。

+0

感謝...私は 'correct_addrがnullであること'と 'correct_addr in(null)'が異なって扱われたことを知らなかった – CheeseConQueso

0

NULL比較は常にfalseです。空の文字列または単一のスペースはNULLではない値です。

ただし、GROUP BYはそれを認識してカウントします。

ので、いくつかのより多くの

select count(correct_addr), COUNT(*) from id_rec GROUP BY correct_addr 

select count(correct_addr), COUNT(*) from id_rec 
where correct_addr <> 'N' or correct_addr IS NULL 

注意をしようとするNULLSを無視し、またCOUNT(列)をこれら

select count(*) from id_rec 
where correct_addr <> 'N' or correct_addr IS NULL 

select count(*) from id_rec 
where COALESCE(correct_addr, 'X') <> 'N' 


select count(*) from id_rec 
where COALESCE(correct_addr, ' ') in (' ','Y'); 

をお試しください:文字をスペースに(1)は常にパッド

関連する問題