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

时间:2013-09-26 19:47:41

标签: sql bit-manipulation

我正在重新开发一个应用程序并找到了这个sql语句,|字符在这个部分(au.ExNetBits | 8)中做了什么,我以前没见过,在网上找不到任何答案?< / p>

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

4 个答案:

答案 0 :(得分:4)

来自the MSDN documentation

| (Bitwise OR) (Transact-SQL)

  

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

     

...

     

按位|运算符在两者之间执行按位逻辑OR   表达式,取两个表达式的每个对应位。该   如果其中一个或两个位,则结果中的位设置为1(对于   输入表达式中的当前位被解析)的值为   1;如果输入表达式中的位都不是1,则结果中的位   设置为0.

     

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

例如,请参阅this fiddle

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

答案 1 :(得分:3)

SQL的几种方言中的|(管道)运算符是bitwise or运算符。

在此用法中,它正在测试以确保在按位或按位后列的值保持不变。另一种做同样事情的方法是使用按位和运算符(&)来掩盖所讨论的位并对掩码进行测试。

我个人发现并且更加惯用而不是方法,但那就是我。

演示结果的SQL小提琴:http://sqlfiddle.com/#!6/aeb46/4

小提琴的内容是:

create table foo (bits integer);

insert into foo values (1), (2), (3), (4), (5), (6), (7), (8), (9)

select bits from foo where (bits | 2) = bits;
select bits from foo where (bits | 8) = bits;

select bits from foo where (bits & 2) = 2;
select bits from foo where (bits & 8) = 8;

2的查询返回2,3,6,7,而8的查询返回8,9。

如果你真的想要,那么8位设置的测试也可以这样做:

select bits from foo where (bits / 8) % 2 = 1

但这只是愚蠢的一面,但它确实有效。

在不使用C风格的按位运算符的语言中,通常有类似的功能来执行按位工作。例如,在Oracle中,可以使用BITANDBITOR(请参阅oracle文档中的BITAND了解如何使用它) - Oracle SQL方言中的&是参数的指示和||用于字符串连接。

答案 2 :(得分:0)

我怀疑|是一个按位OR运算符。因此,您正在使用二进制1000对au.ExNetBits进行ORing - 基本上检查是否设置了一个位。

答案 3 :(得分:0)

我的评论猜对了,Bitwise OR的快速Google显示至少MySQL接受了|作为按位OR的语法: http://dev.mysql.com/doc/refman/5.0/en/bit-functions.html

编辑:正如@satanicpuppy指出的那样,它也是SQL Server中的有效语法。