0

私はクエリの最適化に取り組んでおり、SQLのOR演算子を常にどのように使用しているか疑問に思う状況に遭遇しました。(SQL Server 2000も)

条件付き(WHERE)句が次のようになっているクエリがあります。

WHERE (Column1 = @Param1 or Column1 LIKE @Param1 + '%')
AND (@Param2 = '' OR Column2 = @Param2 OR Column2 LIKE @Param2 + '%')

これで、SQLのORが両方の式を評価することを常に理解しました。したがって、左の式でtrueと評価されたすべてのレコードが、右の式でtrueと評価されたすべてのレコードとともに返されます。例えば:

SELECT * FROM TABLE1
WHERE COL1 = 'Test' OR Col2 = 'Data'

これにより、COL1が「テスト」であるすべてのレコードと、Col2が「データ」であるすべてのレコードが返されます。

上記の例では、次の条件でColumn2を変更しました。

AND(Column2 LIKE ISNULL(@Param2, '') + '%')

突然、0行が返されました。

ORは、TRUEの結果が見つかるまで式を評価するだけであると誤解したことがありますか、それとも2つの異なる結果が異なる結果を返す原因となる条件がありますか?

4

4 に答える 4

3

OR は、特に括弧内にあるため、すべてを網羅しているわけではありません。あなたがより大きな以来持っているものは次のとおりWHERE X AND Yです。X と Y 自体が OR を使用するブール式であるという事実は重要ではありません。これらは別々に評価され、結果が AND 演算子に渡されます。

[編集]:
もう一度読んで、私はあなたの質問を誤解したかもしれません. それを念頭に置いて、NULL LIKE '%'この場合は false と同じ NULL を返すため、他の答えを使用する必要があります。代わりにこれを試すことができます:

COALESCE(Column2,'') LIKE COALESCE(@param2,'') + '%'
于 2009-01-23T18:30:41.763 に答える
1

参考までに、必ずしもすべての条件が評価されるとは限らないことを確認するために実行できる非常に簡単な実験があります。

私はこれを Oracle で行いましたが、SQL Server でも同様の結果になると思います。

dev> select * from dual where 1=1 or 1/0 = 3;

D
-
X

ゼロ除算エラーが発生するため、OR の後の条件は評価されていてはなりません。

ブール演算子のこの処理は、一般に「短絡」として知られており、知る限り、現代の言語ではかなり標準的です。AND 式にも適用できます。最初の条件が false の場合、式全体が TRUE になることはあり得ないため、2 番目の条件を評価しても意味がありません。

詳細: http://en.wikipedia.org/wiki/Short-circuit_evaluation

とにかく、ケイドが言ったように、あなたの本当の問題はおそらくNULLの扱いの誤りです。

于 2009-01-23T18:37:48.987 に答える
0

MS-SQL は最初に左側を評価し、必要でない限り先に進みません。

これは AND コネクタと同じで、左側が評価され、false の場合は右側が評価されません。

于 2009-01-23T18:33:59.027 に答える