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 文档中,

| (按位或)(Transact-SQL)

在 Transact-SQL 语句中转换为二进制表达式的两个指定整数值之间执行按位逻辑 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 回答
3

|SQL 几种方言中的(管道)运算符是按位或运算符。

在这种用法中,它正在测试以确保在应用按位或之后列的值保持不变。做同样事情的另一种方法是使用按位和运算符 ( &) 仅屏蔽有问题的位并根据掩码对其进行测试。

我个人发现 and 比 or 方法更惯用,但这就是我。

演示结果的 SQL Fiddle: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 中将使用BITANDand BITOR(有关如何使用的信息,请参见 oracle 文档中的BITAND& )—— Oracle SQL 方言中的参数表示参数,而 a||表示字符串连接。

于 2013-09-26T23:20:44.850 回答
1

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

于 2013-09-26T19:54:27.700 回答
0

我的评论猜测是正确的,一个快速的谷歌按位或显示至少 MySQL 接受 | 作为按位或的语法:http: //dev.mysql.com/doc/refman/5.0/en/bit-functions.html

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

于 2013-09-26T19:57:09.053 回答