说明:
我的应用程序中的某些存储过程,使用像这样的WHERE
条件:
ISNULL(Status,0) & 128 = 0
这到底是什么意思,或者它是如何比较的?我了解isnull
的条件,但是想知道单个&
运算符的目的是什么。有人可以建议我吗?
以下条件:
ISNULL(Status,0) & 128 = 0
评估是否设置了Status
(= 128)的第八位。使用&
运算符按位执行AND
以评估两个值是否共享相同的位。
在上述情况下,您可以将其分解为:
Status
为Status
,则使用NULL
的值或0AND
此值为128AND
返回0
(因此未设置该位),则返回trueStatus
的位置1,则将返回128
,而不是0
。说明:
ISNULL(Status, 0) & 128 = 0
语句检查8th
列的Status
位是否等于1
。 ISNULL()用指定的替换值替换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
子句的要求,或诸如412
(0110011100
)之类的数字,因为代表128的位的值为1
。附带说明,我个人将以上内容写为:
WHERE (Status & 128 = 0 OR Status IS NULL)
说明:
&
是& (Bitwise AND) (Transact-SQL)并定义为:]