非常に基本的な質問でごめんなさい。このSQLで&
演算子は何をしますか
WHERE (sc.Attributes & 1) = 0
sc
は、列attributes
を含むテーブルのエイリアスです。
レポート内のSQLを理解しようとしていますが、その行で0エントリが返されています。コメントアウトすればうまくいきます。 SQLの知識が限られており、& 1
が何をしているのかわかりません。
&はビット単位の論理および演算子です -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
ビットごとの論理AND演算子 です。
ビット単位および です。
これをSQLサーバーとしてタグ付けしているのを見て、今週もこれらの1つに遭遇したので、別の角度から何かを追加すると思いました。
これらを述語で使用すると、クエリのパフォーマンスが低下する可能性があります。あなた自身の例を製造することは非常に簡単です。これが私のクエリの抜粋です
WHERE
advertiserid = @advertiserid
AND (is_deleted & @dirty > 0)
WHERE
advertiserid = @advertiserid
AND (is_deleted > 0 AND @dirty > 0)
各列を適切な値で定義するだけで、オプティマイザーはブックマークルックアップを削除でき、パフォーマンス統計はX10のパフォーマンスの向上を示しました。