我正在重新开发一个应用程序,发现了这个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 语句中转换为二进制表达式的两个指定整数值之间执行按位逻辑 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
|
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 中将使用BITAND
and BITOR
(有关如何使用的信息,请参见 oracle 文档中的BITAND&
)—— Oracle SQL 方言中的参数表示参数,而 a||
表示字符串连接。
我怀疑 | 是按位或运算符。因此,您正在使用二进制 1000 对 au.ExNetBits 进行 ORing - 本质上是检查是否设置了单个位。
我的评论猜测是正确的,一个快速的谷歌按位或显示至少 MySQL 接受 | 作为按位或的语法:http: //dev.mysql.com/doc/refman/5.0/en/bit-functions.html
编辑:正如@satanicpuppy 指出的,它在 SQL Server 中也是有效的语法。