我正在重新开发一个应用程序并找到了这个sql语句,|
字符在这个部分(au.ExNetBits | 8)
中做了什么,我以前没见过,在网上找不到任何答案?< / p>
SELECT au.AccountID,au.ExNetBits FROM AccountUser au (NOLOCK)
WHERE au.CDAGUserId=102 and (au.ExNetBits | 8) = au.ExNetBits
答案 0 :(得分:4)
在两个指定的整数之间执行按位逻辑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
要解释这种行为,你必须考虑操作数的位模式,
00000001 = 1
| 00000001 = 1
_______________
00000001 = 1
00000001 = 1
| 00000010 = 2
_______________
00000011 = 3
00000010 = 2
| 00000100 = 4
_______________
00000110 = 6
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中,可以使用BITAND
和BITOR
(请参阅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中的有效语法。