2010-12-15 7 views
17

rowTypeID =(1,2,3、またはnull)の列を持つ表があります。私は3の値を持たない行を返すクエリを記述したいと思います。この例では、すべてのNULL行とすべての1,2行を必要とします。3の値を持つ行は不要です。SQL Server return値と等しいではない行とNULL

現在、データベースにはANSI NULLがONに設定されています。

私はこのクエリは、私が

select * from my Table where myCol <> 3 or myCol Is NULL 
を記述する必要がmyCol列

にNULL持っている任意の行を返さない

select * from myTable where myCol <> 3 

を書くことができない理由として興味

私はいつもIS NULLを含める必要がありますか?つまりwhere句myCol <> 3は、Colの値としてNULLを持つ行を返します。

+13

これは、NULLが動作する方法です。それとの比較は、IS NULLとIS NOT NULLを除いてすべてfalseです。 – kurosch

+0

@kurosch:厳密には、次の行に続いて、NULL = NULLもNULLです。 – Marcel

+2

@Marcel:はい、NULL = NULLは常にfalseで、そのことについてはとてもNULLである<> NULL :-) – kurosch

答えて

14

私はあなたのアプローチは大丈夫だと思う:

SELECT * 
FROM MyTable 
WHERE myCol <> 3 OR myCol IS NULL 

あなたは選択肢を求めているので、それを行うための別の方法は、あなたのコラムNOT NULLを作成し、代わりにNULLのデータベース内の別の(otherwised未使用)の値を格納することです - たとえば-1。そうすれば、式myCol <> 3は他の値と同じように、あなたの偽物NULLと一致します。

SELECT * 
FROM MyTable 
WHERE myCol <> 3 

しかし、一般的に、私は、このアプローチを使用するないをお勧めします。あなたがすでにそれをやっている方法は正しい方法です。また

それはいくつかの他のデータベースが正確に何をしたいんどのIS DISTINCT FROMをサポートしていることを言及する価値があるかもしれません:

SELECT * 
FROM MyTable 
WHERE NOT myCol <=> 3 

SELECT * 
FROM MyTable 
WHERE myCol IS DISTINCT FROM 3 

MySQLはまた、この目的のために使用することができNULL-safe equalを持っています残念ながら、SQL Serverはまだこれらの構文のいずれもサポートしていません。

+0

MSサイトのこのISO機能を "DISTINCT PREDICATE"でupvoteしてください:https://connect.microsoft.com/SQLServer/feedback/details/286422/add-language-and-optimizer-support-for-iso-distinct-predicate – montewhizdoh

2

値をテストするたびに、すべてのNULLが省略されます。結局のところ、あるカラムの値が特定の基準を満たしていて、NULLがでない値がであるかどうかをテストしています。

3

NULLevaluate to Unknownという式が含まれているため、NULLを処理する必要があります。あなたがしたい場合は、代わりに行うことができます:

select * 
from MyTable 
where isnull(MyColumn, -1) <> 3 

しかし、これはマジックナンバー(-1)を含み、そして間違いなく読みにくくIS NULLの元のテストよりもです。

編集:とSQLMenaceが指摘するとおり、SARGableではありません。

+3

検索引数可能ではない... MyTableと から – SQLMenace

+0

選択* どこISNULL(MYCOLUMN、3)= 3 – nothrow

+0

@ SQLMenace:良い点、悪化する - 私は私の提案をお勧めしません。 – RedFilter

0

あなたが何かにNULLを比較することはできませんので、NULLはNULL

DECLARE @i INT 
DECLARE @i2 INT 

SELECT @i = NULL, @i2 = NULL 

IF @i = @i2 
PRINT 'equal' 
ELSE 
PRINT 'not equal' 
1

にも、等しくない、私は常にnullであるか、私はそうwhere句を、それを設定することができます含めることがありますかmyCol <> 3は、Colの値としてNullを持つ行を返しますか?

あなた常に常には、常にis nullを含める必要があります。

3はNot/Applicableと等しくなく、Unkownと等しくないためです。

関連する問題