2011-10-29 10 views
2

私はより大きな問題に取り組んでいますが、この質問を簡単にするためにこれを絞り込んでいます。SQL Where Column1 = Column1はnull以外の値しか返しません

次のクエリ:

Select * from User where Country = Country 

は唯一の国がnullでない行を返します。 Column1がNULLの場合、NULL = NULLであるため返されます。

これは私が期待どおりに動作していない理由についての入力はありますか?

EDIT:

私はこれを行うにしようとしています:私の変数@Countryがnullの場合

Select * from User where Country = coalesce(@Country, Country) 

を、私はそれがすべてを引っ張って欲しいです。

答えて

5

SQLは(IS [NOT] NULLオペレータによるテストを除く)NULLthree valued logictruefalseunknown)との比較を使用していないtrue限りのセッションオプションANSI_NULLSがオンになっているようunknownとして評価します。

クエリから返される行については、WHERE節をtrueと評価する必要があります。

あなたの編集後、あなたはとき@country is nullすべての行を返すに

Select * 
from User 
where @Country is null or Country = @Country 
option (recompile) 

を使用することができます。おそらく、これらを2つのケースに分割して、再コンパイルのペナルティを避けるほうが良いでしょう。

IF @Country is null 
Select * 
from User 
ELSE 
Select * 
from User 
Where Country = @Country 
1

NULLあなたはIS演算子を使用してNULLのテスト

国!=国、その国がNULLの場合、NULLに等しいことはありません。

あなたは本当にNULLSをしたい(と私はあなたがなぜ本当に理解しないと、d最初の場所でこのようなクエリをしたい)場合は...

select * from User where IFNULL(Country, '') = IFNULL(Country, '')

または

select * from User where Country = Country or Country IS NULL

を試行し、
+1

NULLはNULLに等しくないため、両方とも定義されていないため、NULLはNULLに等しくないため、NULLはNULLと等しくありません。 –

+0

"NULLは決してNULLに等しい" - 真ではありません。ヒント: 'GROUP BY'と' ORDER BY'。 – onedaywhen

+0

@onedaywhen: 'distinct'(' SQL:2003 3.1.6.8'で定義)と 'equal'(' SQL:2003 3.1.6.13'で定義されています)を混同しています。これらは 'SQL'では異なる概念であり、' GROUP BY'では 'not distinct'値をグループ化します。 – Quassnoi

関連する問題