アプリケーションを再開発していて、この SQL ステートメントを見つけました。|
キャラクターはこの部分(au.ExNetBits | 8)
で何をしますか?
SELECT au.AccountID,au.ExNetBits FROM AccountUser au (NOLOCK)
WHERE au.CDAGUserId=102 and (au.ExNetBits | 8) = au.ExNetBits
アプリケーションを再開発していて、この SQL ステートメントを見つけました。|
キャラクターはこの部分(au.ExNetBits | 8)
で何をしますか?
SELECT au.AccountID,au.ExNetBits FROM AccountUser au (NOLOCK)
WHERE au.CDAGUserId=102 and (au.ExNetBits | 8) = au.ExNetBits
MSDNのドキュメントから、
Transact-SQL ステートメント内のバイナリ式に変換された、指定された 2 つの整数値の間でビットごとの論理 OR 演算を実行します。
...
ビットごとの | operator は、2 つの式の間でビットごとの論理 OR を実行し、両方の式に対応する各ビットを取得します。入力式のいずれかまたは両方のビット (解決されている現在のビット) の値が 1 の場合、結果のビットは 1 に設定されます。入力式のどちらのビットも 1 でない場合、結果のビットは 0 に設定されます。
左右の式の整数データ型が異なる場合 (たとえば、左側の式がsmallintで右側の 式がintの場合)、小さい方のデータ型の引数が大きい方のデータ型に変換されます。この例では、smallint 式がintに変換されます。
たとえば、このフィドルを参照してください。
SELECT 1 | 1, 1 | 2, 2 | 4, 3 | 5;
出力
1 3 6 7
この動作を説明するには、オペランドのビット パターンを考慮する必要があります。
00000001 = 1
| 00000001 = 1
_______________
00000001 = 1
00000001 = 1
| 00000010 = 2
_______________
00000011 = 3
00000010 = 2
| 00000100 = 4
_______________
00000110 = 6
00000011 = 3
| 00000101 = 5
_______________
00000111 = 7
私はそれを疑うだろう | ビットごとの OR 演算子です。したがって、au.ExNetBits とバイナリ 1000 の OR をとっています - 基本的に、単一のビットが設定されていることを確認しています。
私のコメントの推測は正しかった。Bitwise OR の簡単な Google は、少なくとも MySQL が | を受け入れることを示している。ビットごとの OR の構文として: http://dev.mysql.com/doc/refman/5.0/en/bit-functions.html
編集: @satanicpuppy が指摘するように、SQL Server でも有効な構文です。