web-dev-qa-db-ja.com

等しくない<>!= NULLの演算子

誰かがSQLで次の動作を説明してもらえますか?

SELECT * FROM MyTable WHERE MyColumn != NULL (0 Results)
SELECT * FROM MyTable WHERE MyColumn <> NULL (0 Results)
SELECT * FROM MyTable WHERE MyColumn IS NOT NULL (568 Results)
244

<>は標準SQL-92です。 !=はそれと同等です。どちらも値を評価しますが、NULLはそうではありません - NULLは、値がないことを表すプレースホルダーです。

そのため、IS NULL/IS NOT NULLをそのような状況の述語としてしか使用できないのはこのためです。

この動作はSQL Serverに固有のものではありません。すべての規格準拠のSQL言語は同じように機能します。

値がnullでない場合を比較するには、IS NOT NULLを使用します。 、nullではない値と比較しながら、<> 'YOUR_VALUE'を使用します。自分の値がNULLと等しいかどうかはわかりませんが、自分の値がNULLかNOT NULLかはわかりません。自分の値がNULL以外の値であれば比較できます。

279
OMG Ponies

NULLには値がないため、スカラー値演算子を使用して比較することはできません。

つまり、NULLには値がないため、値がNULLに等しくなる(または等しくない)ことはありません。

したがって、SQLには、NULLを扱うための特別なIS NULLおよびIS NOT NULL述語があります。

81
Barry Brown

この動作はデフォルト(ANSI)の動作です。

もし、あんたが:

 SET ANSI_NULLS OFF

http://msdn.Microsoft.com/ja-jp/library/ms188048.aspx

あなたは異なる結果を得るでしょう。

SET ANSI_NULLS OFFはどうやら将来はなくなるでしょう...

25
Cade Roux

NULLの唯一のテストはIS NULLまたはIS NOT NULLです。定義上、値が何であるかがわからないため、等価性のテストは無意味です。

これが読むべきウィキペディアの記事です:

https://en.wikipedia.org/wiki/Null_(SQL)

7
dkretz

SQLでは、NULLを使って評価/計算した結果はすべて不明になります。

これが、SELECT * FROM MyTable WHERE MyColumn != NULLまたはSELECT * FROM MyTable WHERE MyColumn <> NULLが0の結果を与える理由です。

NULL値をチェックするために、isNull関数が提供されています。

さらに、3番目のクエリで使用したようにIS演算子を使用できます。

お役に立てれば。

7
Mahendra Liya

を使用しております

SELECT * FROM MyTable WHERE ISNULL(MyColumn, ' ') = ' ';

myColumnがNULLのすべての行、またはMyColumnが空の文字列のすべての行を返します。多くの「エンドユーザー」にとって、NULL文字列と空文字列の問題は区別もなく、混乱の必要もありません。

6
Jeff Mergler

機能的でシームレスなnull値が他の値や他のnull値と比較できないとは思わないので、それを明確に比較して、同じかどうかを判断することができます。それはおかしいです。いくつかの論理的な結論と一貫性のために、我々はそれを絶えず気にする必要があります。それは機能的ではない、それをより機能的にし、それが矛盾しているかどうかを結論づけるために哲学者と科学者に任せ、そしてそれは「普遍的な論理」を保持するか。誰かがそれがインデックスか何か他のものが原因であると言うかもしれません、私はそれらの事が値と同じnullをサポートするように作られることができなかったかどうか疑います。 2つの空のグラスを比較するのと同じです。1つはVineグラス、もう1つはビアグラスです。オブジェクトのタイプを比較するのではなく、それらに含まれる値を比較します。 2つの共通点は何も共通点がありません。それらは同じもので、私とSQLを書く他の誰もが明らかに匹敵するものです。私たちのためにコンピュータの電源を使用しないでください。関連するすべてのものを念頭に置いて構成されていると、作業が遅くなることはないと思います。 「それはヌルではない、それは何もない」、それはアップルではない、それでは上に来る...機能的にはあなたの友達であり、ここでも論理があります。結局のところ重要なことは機能性だけであり、そのようにnullを使用することは多かれ少なかれ機能性と使いやすさをもたらします。もっと便利ですか?

このコードを見てください:

SELECT CASE WHEN NOT (1 = null or (1 is null and null is null)) THEN 1 ELSE 0 end

このコードが何を返すのか知っている人は何人ですか? NOTがあってもなくても0が返されます。私にはそれは機能的ではなく、混乱を招きます。 c#では、比較操作で値が返されるので、論理的にも値が生成されます。比較対象がない場合は(。nothing :)を除く)。単に「言った」:nullと比較したものは「0」を返し、それが多くの回避策と頭痛の種を生み出します。

これは私をここに持ってきたコードです:

where a != b OR (a is null and b IS not null) OR (a IS not null and b IS null)

2つのフィールド(where)の値が異なるかどうかを比較するだけです。関数を使用できますが、...

4
Hrvoje Batrnek

NULL比較演算子を使用して任意の値と比較することはできません。 NULL = NULLは偽です。 NULLは値ではありません。 IS演算子は、特にNULL比較を処理するように設計されています。

4

昔の質問ですが、以下でもう少し詳しく説明します。

nullは、値がないか未知の値を表します。whyが指定されていないため、多少あいまいになる可能性があります。

次のようなクエリを実行したとします。

SELECT *
FROM orders
WHERE delivered=ordered;

つまり、ordereddeliveredの日付が同じ行を探しています。

片方または両方の列がNULLの場合、何が予想されますか?

少なくとも1つの日付が不明であるため、2つの日付が同じであると言うことは期待できません。これは、bothdateが未知の場合にも当てはまります。それらが何であるかさえわからなければ、どうして同じになるのでしょうか。

このため、nullを値として扱う式はすべて失敗するはずです。この場合、それは一致しません。次のことを試した場合も同様です。

SELECT *
FROM orders
WHERE delivered<>ordered;

繰り返しますが、2つの値がnotであることがわからない場合は、どうしたらいいでしょうか。

SQLには、欠損値に対する特定のテストがあります。

IS NULL

具体的にはと比較してではなく、missingvaluesを探します。

最後に、!=演算子に関しては、私が知っている限りでは、実際にはどの標準にも含まれていませんが、非常に広くサポートされています。これは、ある言語のプログラマーが自宅をより快適にするために追加されました。率直に言って、プログラマーが自分が使っている言語を思い出すのが困難な場合、彼らは悪いスタートを切ってしまいます。

1
Manngo

NULLは何もしていません...それは未知数です。 NULLは何も等しくありません。 SQLクエリで= NULLの代わりにマジックフレーズIS NULLを使用する必要があるのはそのためです。

あなたはこれを参照することができます: http://weblogs.sqlteam.com/markc/archive/2009/06/08/60929.aspx

0
Shadow