1

私はSQLクエリを実行するための良い方法を探していました。ここで、whereステートメントを使用できます。このステートメントは、空白のままにすると、まったく存在しなかったように動作します。私はこれを見つけました、それは非常にうまくいくようです:

WHERE (Column = @value OR @value is null)

@valueに値を指定すると、検索は必要に応じてフィルタリングされます。しかし、nullを渡すと、@valueは何でもかまいません。私はこれが好き。これはいい。私が理解していないのは、なぜこれがこのように機能するのですか?

4

2 に答える 2

3

@value が null の場合、WHERE 句は次のようになります。

WHERE (Column = @value OR @value is null)

に減少します

WHERE (Column = @value OR 1=1)

(これはif (Column == value || true)他の一般的な言語と同様です)

オペランド (辺) のいずれかが真の場合、OR 結合は真です。SQL は 3 つの値を持つ論理を使用します。

+---------+------+---------+---------+
| A OR B  | TRUE | Unknown |  FALSE  |
+---------+------+---------+---------+
| TRUE    | TRUE | TRUE    | TRUE    |
| Unknown | TRUE | Unknown | Unknown |
| FALSE   | TRUE | Unknown | FALSE   |
+---------+------+---------+---------+

など:

  • @value が null の場合、WHERE 句の右側が true になるため、条件全体が true になり、WHERE 句は常に満たされます。
  • @valuenull でない場合、WHERE 句の右側が false であり、WHERE 句が満たされるかどうかはColumn = @value.
于 2013-01-13T03:57:41.700 に答える
1

さて、次の 2 つのケースがあります。

1) @値は「何か」です。

この場合、"something" が null になることはないため、2 番目の句は常に false になります。したがって、実質的に残るのはWHERE Column = @value.

2) @値が null です

この場合、2 番目の句は常に false です。これは、null が何にも等しくならないためです。したがって、実質的に残っているWHERE @value is nullのは @value が null であることがわかっているため、これは同様WHERE 1 = 1で、WHERE 全体が無視されます。データベースは、データに触れる前にこれを理解するのに十分なほど賢くある必要があるため、条件がまったく指定されていない場合と同じように実行する必要があります。

つまり、ここにあるのは、「オプションの WHERE」を使用して、2 つのように機能する単一の SQL ステートメントです。この 2 つのケースで 2 つの別々の SQL ステートメントを使用するよりも優れている点は、SQL ステートメントを作成するときにアプリケーションに条件付きロジックが必要ないことです (これらの "トグル" が複数ある場合、非常に複雑になる可能性があります)。

于 2013-01-13T03:59:23.470 に答える