[SQL] 短絡評価

int num = 0;
if(int.TryParse(aText, num) && num > 40)
{
    // ....
}

上記のようなif文において C#(に限らずだが)では、記述順にint.TryParseが先に評価され、その結果がFalseであればnum > 40は評価されない。これを短絡評価(たんらくひょうか、英: short-circuit evaluation)というらしい。

しかしSQLの WHERE句は短絡評価ではない。SQL2003標準ではDBMSの実装依存としている。DBMSによっては親切で?短絡評価をしているものもあるらしいが、SQL Serverでは下記のようなSQLで、bar列に文字列値が含まれている場合にエラーとなった。

SELECT * FROM foo
WHERE ISNUMERIC(bar) = 1 AND CONVERT(INTEGER, bar) > 40

-- CONVERTが文字列値を変換しようとしてエラーとなる

参考
Is the SQL WHERE clause short-circuit evaluated?

SQLを直接書く場合もそうだが、以前のエントリのように EntityFramework / Linq to SQLを使って書くときにもwhereに短絡評価な条件を書いてしまわないよう気をつけないと。

広告