此SQL语句的含义是什么? ISNULL(状态,0)&128 = 0?

问题描述 投票:3回答:3

我的应用程序中的某些存储过程,使用像这样的WHERE条件:

ISNULL(Status,0) & 128 = 0

这到底是什么意思,或者它是如何比较的?我了解isnull的条件,但是想知道单个&运算符的目的是什么。有人可以建议我吗?

sql sql-server sql-server-2008 sql-server-2008-r2
3个回答
4
投票

以下条件:

ISNULL(Status,0) & 128 = 0

评估是否设置了Status(= 128)的第八位。使用&运算符按位执行AND以评估两个值是否共享相同的位。

在上述情况下,您可以将其分解为:

    [如果StatusStatus,则使用NULL的值或0
  • 按位AND此值为128
  • 如果按位AND返回0(因此未设置该位),则返回true
  • 顺便说一句,如果Status的位置1,则将返回128,而不是0

说明:

ISNULL(Status, 0) & 128 = 0语句检查8th列的Status位是否等于1ISNULL()用指定的替换值替换NULL,& (bitwise AND)在两个整数值之间执行按位逻辑AND运算。

对此检查的一种解释是,有时更适合在一个列中存储多个位值,而不是为每个值创建多个位列。该方法基于使用POWER功能的附加计算。之后,需要& (BITWISE AND)运算符才能获取每个存储的开关的值。

示例:

下一个示例基于问题中的陈述,展示了如何在一行中存储7个开关的值,然后检查给定开关的状态。

-- Calculation DECLARE @switch int SELECT @switch = ( POWER(2 * 0, 1) + -- switch 1 is off POWER(2 * 0, 2) + -- switch 2 is off POWER(2 * 0, 3) + -- switch 3 is off POWER(2 * 0, 4) + -- switch 4 is off POWER(2 * 0, 5) + -- switch 5 is off POWER(2 * 0, 6) + -- switch 6 is off POWER(2 * 1, 7) -- switch 7 is on ) -- Check for switch 7. 128 is equal to POWER(2, 7) IF ISNULL(@switch, 0) & 128 = 0 PRINT 'OFF' ELSE PRINT 'ON' -- All checks SELECT CASE WHEN ISNULL(@switch, 0) & POWER(2, 1) /* or 2 */ = 0 THEN 'Switch1 is OFF' ELSE 'Switch1 IS ON' END, CASE WHEN ISNULL(@switch, 0) & POWER(2, 2) /* or 4 */ = 0 THEN 'Switch2 is OFF' ELSE 'Switch2 IS ON' END, CASE WHEN ISNULL(@switch, 0) & POWER(2, 3) /* or 8 */ = 0 THEN 'Switch3 is OFF' ELSE 'Switch3 IS ON' END, CASE WHEN ISNULL(@switch, 0) & POWER(2, 4) /* or 16 */ = 0 THEN 'Switch4 is OFF' ELSE 'Switch4 IS ON' END, CASE WHEN ISNULL(@switch, 0) & POWER(2, 5) /* or 32 */ = 0 THEN 'Switch5 is OFF' ELSE 'Switch5 IS ON' END, CASE WHEN ISNULL(@switch, 0) & POWER(2, 6) /* or 64 */ = 0 THEN 'Switch6 is OFF' ELSE 'Switch6 IS ON' END, CASE WHEN ISNULL(@switch, 0) & POWER(2, 7) /* or 128 */ = 0 THEN 'Switch7 is OFF' ELSE 'Switch7 IS ON' END

[&& (Bitwise AND) (Transact-SQL)并定义为:]

在两个整数值之间执行按位逻辑与运算。

...

备注

&按位运算符在两个表达式之间执行按位逻辑与,并取两个表达式的每个对应位。当且仅当输入表达式中的两个位(对于要解析的当前位)的值都为1时,结果中的位才设置为1;否则,将结果中的位设置为1。否则,结果中的位设置为0。

如果左右表达式具有不同的整数数据类型(例如,左表达式为smallint,右表达式为int),则较小数据类型的参数将转换为较大数据类型。在这种情况下,smallintexpression将转换为int。

在这种情况下,当Status的值的位值为128(1)的值为10000000时,条件将为假。因此,诸如128-255之类的数字将不符合WHERE子句的要求,或诸如4120110011100)之类的数字,因为代表128的位的值为1

附带说明,我个人将以上内容写为:

WHERE (Status & 128 = 0 OR Status IS NULL)


2
投票

说明:


1
投票
[&& (Bitwise AND) (Transact-SQL)并定义为:]
© www.soinside.com 2019 - 2024. All rights reserved.