web-dev-qa-db-ja.com

SQLの「IS」演算子と「=」演算子はどのように異なりますか?

パラメータ化された値を使用するいくつかのプリペアドステートメントを作成しています。例として:

SELECT * FROM "Foo" WHERE "Bar"=@param

時々 @paramNULLの可能性があります。このような場合、クエリでBarNULLであるレコードを返したいのですが、上記のクエリではそれができません。これにはIS演算子を使用できることを学びました。言い換えると:

SELECT * FROM "Foo" WHERE "Bar" IS @param

NULLの扱いの違い以外に、上記の2つのステートメントの動作が異なる方法は他にありますか?仮に @paramNULLではありませんが、代わりに5?その場合、IS演算子を使用することは安全な(そして正気の)ことですか?私が取るべき他のアプローチはありますか?

18
Dan Moulding

Bar = @paramの場合、または@paramがnullの場合、Barがnullの場合、Fooからのレコードが必要です。提案されたソリューションのいくつかは、null以外の@paramでnullレコードを提供しますが、これは要件のようには聞こえません。

Select * from Foo where (@param is null and Bar is null) or (Bar = @param)

それぞれがわずかに異なるヘルパー関数を実装しているため、これがOracle、SQL Server、または別のRDBMSであるかどうかはわかりません。 NVL(first、second)のようなSQLのISNULL(first、second)。一般的な適用性については、SQL ServerのCOALESCE()が好きです。

IS比較は、null比較専用です。

SQL Serverを使用していて、問題を解決するために別の3VL論理真理値表が本当に必要である場合(つまり、 「NULL = NULL」は、ある時点で「true」になります。また、これは非推奨であり、理由がないことを認識します。一般的には良い考えではありません)、コードブロック内でディレクティブを使用できます。

ANSI_NULLSをオフに設定

これがBOLです: http://msdn.Microsoft.com/en-us/library/ms188048.aspx

13
user662852

編集:(OPからの更新:これは私が何をしないか@paramが5の場合、Barが5のレコードのみを表示したい。BarがNULLのレコードのみを表示したい場合のみ。 、@ paramはNULLです。質問で明確にならなかった場合はお詫びします。)

その場合、次のようなことを試してみるべきだと思います。

SELECT * FROM Foo WHERE Bar=@param OR (Bar IS NULL AND @param IS NULL)

前の投稿:

単純にORを使用しないのはなぜですか?

SELECT * FROM "Foo" WHERE "Bar"=@param OR "Bar" IS NULL

SQL Serverでは、ISNULLを使用できます。

SELECT * FROM "Foo" WHERE ISNULL("Bar",@param)=@param
6
Hari Menon

あなたはこれについて間違って考えているかもしれません。たとえば、SQL Serverについて話している場合(これは私が手渡さなければならないことなので)、2番目の例では構文エラーが発生します。 ISの右側の値を5にすることはできません。

説明するために、T-SQLでのこれら2つの演算子に関するMSDNの説明を検討してください(「SQL」と「SQLServer」について尋ねるのは必ずしも同じではないことに注意してください)。

等しい(=)演算子

IS NULL演算子

そこに重要な何かに注意してください。 T-SQLには「IS」演算子のようなものはありませんがあります。具体的には、単一の式をNULLと比較する<expression> IS [NOT] NULL演算子があります。

それは=演算子と同じではありませんtwo式を相互に比較し、特定の式の一方または両方がたまたまNULLになった場合の動作!

6
Dan J

使用しているSQLのバージョンはわかりませんが、ISは、今説明したコンテキストでは意味がありません。説明した方法で使用しようとすると、構文エラーが発生します。理由とにかくそれを使いたいですか?これは一般的な使用法であり、ソフトウェアメンテナーが見つけることを期待しているものです。

3
HLGEM

どの特定のデータベースを使用していますか?

Null(またはnull以外)に基づいて検索を行う場合は、ISを使用するのが最善の方法です。技術的な理由を提供することはできませんが、常にこの構文を使用しています。

SELECT * FROM Table WHERE Field IS NULL

SELECT * FROM Table WHERE Field IS NOT NULL
2
Angry Spartan