パラメータ化された値を使用するいくつかのプリペアドステートメントを作成しています。例として:
SELECT * FROM "Foo" WHERE "Bar"=@param
時々 @param
はNULL
の可能性があります。このような場合、クエリでBar
がNULL
であるレコードを返したいのですが、上記のクエリではそれができません。これにはIS
演算子を使用できることを学びました。言い換えると:
SELECT * FROM "Foo" WHERE "Bar" IS @param
NULL
の扱いの違い以外に、上記の2つのステートメントの動作が異なる方法は他にありますか?仮に @param
はNULL
ではありませんが、代わりに5
?その場合、IS
演算子を使用することは安全な(そして正気の)ことですか?私が取るべき他のアプローチはありますか?
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
編集:(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
あなたはこれについて間違って考えているかもしれません。たとえば、SQL Serverについて話している場合(これは私が手渡さなければならないことなので)、2番目の例では構文エラーが発生します。 ISの右側の値を5にすることはできません。
説明するために、T-SQLでのこれら2つの演算子に関するMSDNの説明を検討してください(「SQL」と「SQLServer」について尋ねるのは必ずしも同じではないことに注意してください)。
そこに重要な何かに注意してください。 T-SQLには「IS」演算子のようなものはありませんがあります。具体的には、単一の式をNULLと比較する<expression> IS [NOT] NULL
演算子があります。
それは=
演算子と同じではありませんtwo式を相互に比較し、特定の式の一方または両方がたまたまNULLになった場合の動作!
使用しているSQLのバージョンはわかりませんが、ISは、今説明したコンテキストでは意味がありません。説明した方法で使用しようとすると、構文エラーが発生します。理由とにかくそれを使いたいですか?これは一般的な使用法であり、ソフトウェアメンテナーが見つけることを期待しているものです。
どの特定のデータベースを使用していますか?
Null(またはnull以外)に基づいて検索を行う場合は、ISを使用するのが最善の方法です。技術的な理由を提供することはできませんが、常にこの構文を使用しています。
SELECT * FROM Table WHERE Field IS NULL
SELECT * FROM Table WHERE Field IS NOT NULL