34

非常に基本的な質問でごめんなさい。&このSQLで演算子は何をしますか

WHERE (sc.Attributes & 1) = 0 

sc列を含むテーブルのエイリアスですattributes

レポート内のSQLを理解しようとしていますが、その行で0エントリが返されています。コメントアウトすればうまくいきます。SQLの知識が限られており、何をしているのかわかりません& 1

4

4 に答える 4

49

&はビット単位の論理演算子です-2つの整数値に対して演算を実行します。

WHERE (sc.Attributes & 1) = 0 

上記のコードは、sc.Attributesが偶数かどうかを確認します。これは、最初のビットが設定されていないということと同じです。

ただし、列の名前が「属性」であるため、「1」の値は、外部的な意味を持つ単なるフラグである可能性があります。

属性の番号に格納されているフラグごとに1桁の2進数を使用するのが一般的です。したがって、最初のビットをテストするにはsc.Attributes&1を使用し、2番目のビットをテストするにはsc.Attributes&2を使用し、3番目のビットをテストするにはsc.Attributes&4を使用し、4番目のビットをテストするにはsc.Attributes&8を使用します。

= 0の部分は、最初のビットが設定されていないかどうかをテストしています。

いくつかのバイナリの例:(==操作の結果を表示する)

//Check if the first bit is set, same as sc.Attributes&1
11111111 & 00000001 == 1
11111110 & 00000001 == 0
00000001 & 00000001 == 1


//Check if the third bit is set, same as sc.Attributes&4
11111111 & 00000100 == 1
11111011 & 00000100 == 0
00000100 & 00000100 == 1
于 2009-03-21T23:44:13.587 に答える
5

これはビット単位の論理積演算子です。

于 2009-03-21T23:41:39.600 に答える
5

少し賢明です。

于 2009-03-21T23:42:07.803 に答える
1

あなたがこれを sql server としてタグ付けしたのを見て、今週もこれらの 1 つに遭遇したので、別の角度から何かを追加すると思いました。

これらを述語で使用すると、クエリのパフォーマンスが低下する可能性があります。独自の例を非常に簡単に作成できます。これが私のクエリのスニペットです

WHERE
advertiserid = @advertiserid
AND (is_deleted & @dirty > 0)

WHERE
advertiserid = @advertiserid
AND (is_deleted > 0 AND @dirty > 0)

各列を適切な値で定義するだけで、オプティマイザはブックマークのルックアップを削除でき、パフォーマンス統計は X10 パフォーマンスの向上を示しました。

于 2012-06-19T20:48:59.360 に答える