2011-08-05 21 views
5

多くの現代のプログラミング言語は、次のような短絡的なブール評価を持っている:近代DBMSに短絡ブール評価が含まれていますか?

if (x() OR y()) 

x()あればリターンが真、y()が評価されることはありません。

現代のDBMS(SQL Server、Sybase、Oracle、DB2など)のSQLはこのプロパティを持っていますか?

特にブールステートメントの左側がブール定数の場合、短絡されますか?関連


Do all programming languages have boolean short-circuit evaluation?

答えて

1

はいなし。

(以下、もっぱらSQL Serverを参照)

いくつかの演算子のショートサーキットと一部にはありません。 ORCAN短絡ですが、クエリエンジンによって選択された操作の順序に依存しない場合があります。

CASEは(私は)100%短絡が保証されています。

また同様に、ネストされた括弧で評価の順序を強制しようとすることができます:

IF ((X) OR Y)

しかし、私は、これはどちらか常に一貫して正ではありませんよ。

この点に関するSQLの問題は宣言的であり、実際のロジックはエンジンによって実行されることです。実際にYをあなたの例からチェックし、次にがインデックスされ、Xがテーブルスキャンを必要とする場合、Xをチェックする方が効率的かもしれません。参考のために

:優先順位は形式または 括弧によって決定されていないANSI-SQLのドキュメントfrom this answer:

から

、表現の効果的な評価は、一般的に であるが、左から実行します右に。しかし、それは実装依存である 式が実際に左から右に評価されているかどうか、特に オペランドや演算子は、条件を上昇させるか 場合、式の結果が完全に のすべての部分を評価せずに測定することができる原因となる可能性がある場合表現。

+0

CASEはSQLではありませんので、私はそれが適用されるかどうかはわかりません。 (でもそれはt-SQLである) –

+0

@Billy - 良い点、私は答えの冒頭に警告を付け加えた。 – JNK

+0

+1のドキュメント参照 –

1

特にSQL Serverについて言えば - の並べ替え。

OR文を指定した順序では、オプティマイザは性能向上が得られたと思われる場合にオプティマイザが即座にそれらを並べ替えることができるため、短絡を保証することはできません。

しかし、基礎をなすエンジン自体が短絡する可能性があります。それはユーザーが制御できないものです。

(他の優秀な議論/リソースへのリンク)は、次の資料では、このトピックの詳細を持っていますhttp://weblogs.sqlteam.com/jeffs/archive/2008/02/22/sql-server-short-circuit.aspx

+1

これは同じ理由でPostgreSQL [http://www.postgresql.org/docs/9.1/static/sql-expressions.html#SYNTAX-EXPRESS-EVAL]にも当てはまります。 – SingleNegationElimination

関連する問題