7

アプリケーションを再開発していて、この SQL ステートメントを見つけました。|キャラクターはこの部分(au.ExNetBits | 8)で何をしますか?

SELECT au.AccountID,au.ExNetBits FROM AccountUser au (NOLOCK)
WHERE au.CDAGUserId=102 and (au.ExNetBits | 8) = au.ExNetBits

4

4 に答える 4

5

MSDNのドキュメントから、

| | (ビットごとの OR) (Transact-SQL)

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

この動作を説明するには、オペランドのビット パターンを考慮する必要があります。

1 | 1

  00000001  = 1
| 00000001  = 1
_______________
  00000001  = 1

1 | 2

  00000001  = 1
| 00000010  = 2
_______________
  00000011  = 3

2 | 4

  00000010  = 2
| 00000100  = 4
_______________
  00000110  = 6

3 | 5

  00000011  = 3
| 00000101  = 5
_______________
  00000111  = 7
于 2015-05-06T08:55:44.983 に答える
1

私はそれを疑うだろう | ビットごとの OR 演算子です。したがって、au.ExNetBits とバイナリ 1000 の OR をとっています - 基本的に、単一のビットが設定されていることを確認しています。

于 2013-09-26T19:54:27.700 に答える
0

私のコメントの推測は正しかった。Bitwise OR の簡単な Google は、少なくとも MySQL が | を受け入れることを示している。ビットごとの OR の構文として: http://dev.mysql.com/doc/refman/5.0/en/bit-functions.html

編集: @satanicpuppy が指摘するように、SQL Server でも有効な構文です。

于 2013-09-26T19:57:09.053 に答える