web-dev-qa-db-ja.com

SQL Server WHERE句のアンパサンド(&)演算子

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

WHERE (sc.Attributes & 1) = 0 

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

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

30
Jimmymcnulty

&はビット単位の論理および演算子です -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
46
Brian R. Bondy
3
Andrew Hare
3
MarkusQ

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

これらを述語で使用すると、クエリのパフォーマンスが低下する可能性があります。あなた自身の例を製造することは非常に簡単です。これが私のクエリの抜粋です

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

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

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

1
Chris Wood