说明:
语句ISNULL(Status, 0) & 128 = 0 检查Status 列的8th 位是否等于1。 ISNULL() 将 NULL 替换为指定的替换值,& (bitwise 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