管道操作员在SQL中做了什么?

Ant*_*lay 6 sql bit-manipulation

我正在重新开发一个应用程序,并且已经找到了这个sql语句,该|角色在这一部分做了什么(au.ExNetBits | 8),我以前没见过,在网上找不到任何答案?

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

Jod*_*ell 5

MSDN文档中

| (按位或)(Transact-SQL)

在两个指定的整数值之间执行按位逻辑或运算,该整数值转换为Transact-SQL语句中的二进制表达式。

...

按位| 运算符在两个表达式之间执行按位逻辑“或”运算,并取两个表达式的每个对应位。如果输入表达式中的任一位或两个位(对于要解析的当前位)的值均为1,则结果中的位设置为1;否则,将结果中的位设置为1。如果输入表达式中的任何一位都不为1,则结果中的位设置为0。

如果左右表达式具有不同的整数数据类型(例如,左表达式smallint,右 表达式int),则较小数据类型的参数将转换为较大数据类型。在此示例中,smallint 表达式被转换为int

例如,看这个小提琴

SELECT 1 | 1, 1 | 2, 2 | 4, 3 | 5;
Run Code Online (Sandbox Code Playgroud)

输出

1    3    6    7
Run Code Online (Sandbox Code Playgroud)

为了解释这种行为,您必须考虑操作数的位模式,

1 | 1个

  00000001  = 1
| 00000001  = 1
_______________
  00000001  = 1
Run Code Online (Sandbox Code Playgroud)

1 | 2

  00000001  = 1
| 00000010  = 2
_______________
  00000011  = 3
Run Code Online (Sandbox Code Playgroud)

2 | 4

  00000010  = 2
| 00000100  = 4
_______________
  00000110  = 6
Run Code Online (Sandbox Code Playgroud)

3 | 5

  00000011  = 3
| 00000101  = 5
_______________
  00000111  = 7
Run Code Online (Sandbox Code Playgroud)


Cra*_*rer 1

我怀疑 | 是按位或运算符。因此,您将 au.ExNetBits 与二进制 1000 进行“或”运算 - 本质上是检查是否设置了单个位。