2

私はMSSQLで私を困惑させることに出くわしました。私が次のようなことをした場合:

SELECT 1 | 0 & 0

出力は次のとおりです。オペレーターがオペレーターよりも優先される0と思います。&|

何か案は ?これはバグですか、それともMSSQLの意図された動作ですか?

4

1 に答える 1

4

@MartinSmithがすでにコメントで参照しているSQLServer演算子の優先順位テーブル(SQL2k8 +)によると、優先順位は次のようになります。

Level Operators

1     ~ (Bitwise NOT)
2     * (Multiply), / (Division), % (Modulo)
3     + (Positive), - (Negative), + (Add), (+ Concatenate), - (Subtract), & (Bitwise AND), ^ (Bitwise Exclusive OR), | (Bitwise OR)
4     =, >, <, >=, <=, <>, !=, !>, !< (Comparison operators)
5     NOT
6     AND
7     ALL, ANY, BETWEEN, IN, LIKE, OR, SOME
8     = (Assignment)

式内の2つの演算子の優先順位が同じである場合、式内の位置に基づいて左から右に評価されます。

ビット演算子に関する問題

ご覧のとおり、ビット演算子はすべて同じレベル(3)にあるため、左から右に評価されます。したがって、この例|では、最初に評価され、次に&

ブール論理演算子は異なります

これらはもちろんビット単位の演算子であり、論理演算子ではありません。ANDレベル6とOR7があるため、もちろん正しい順序で評価されます。これは、AND最初とOR後で評価されることを意味します。

もちろん、かっこは重要な表現に適した選択肢です。あなたの場合、それは些細なことのように思えます、したがって、ブラケットは使用されませんでしたが、ビット演算子は同じレベルで動作するため、少なくとも3つのオペランドを組み合わせる場合、または演算子を評価したい方法で順序付ける場合は、それらを使用する必要があります。あなたの場合:

select 0 & 0 | 1

正しい結果が得られます。

いつもこうだったわけではない

SQL Server 2008以降、ビット演算子の優先順位が均等化されています。SQL Server 2005以前では、下位レベル(5)でビット単位|(排他的論理和または)が使用されていたため、式は正しく評価されます。^Microsoftがすべてのビット演算子を同じレベルに置くことにした理由は私には謎です。

SQL Books Onlineが無効な実際の処理について述べていることが判明しました(@MartinSmithに感謝します)。そのため、SQL Server 2008の演算子の優先順位レベルのドキュメントページを更新しただけです。したがって、これはずっと長い間(おそらく常に)このように機能しているようです。

于 2012-07-16T09:57:43.210 に答える