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