如何将位掩码应用于MySQL中的整数



问题是:

数据库Rx30在一个名为"Rxstatus"的字段中存储处方的状态。它们存储的数字是一个不大于255的整数。设置的位决定脚本是否被填充。

一个代表告诉我们,如果设置了16,32或128,则认为脚本是'未填充'。

那么现在我们需要做的是取一个整数,比如'49',看看哪些位被设置了。为了速度的缘故,这需要通过MySQL来完成。我理解49是:

32+16+1 = 49

所以在这个字段中设置了16,因此脚本是未填充的。

我如何(在MySQL中)取一个整数,例如152,并确定它的哪些位是设置的?

一旦我们确定了设置的内容,如果设置了16,32或128,我们可以认为脚本未填充并生成正确的结果。

如果你有一个测试位掩码,例如32+16+1 = 49,并且你想知道这些中的任何是否在Rxstatus中设置,你使用:

SELECT Rxstatus & 49 != 0

如果你想知道是否所有都已设置,使用:

SELECT Rxstatus & 49 = 49

要设置位掩码中的所有位,请执行:

UPDATE Rx30
SET Rxstatus = Rxstatus | 49
WHERE <condition>

要清除位掩码中的所有位,可以这样做:

UPDATE Rx30
SET Rxstatus = Rxstatus & ~49
WHERE <condition>

使用MySQL的BIT函数,如&

select Rxstatus & 2 = 2 as 2_set, 
       Rxstatus & 4 = 4 as 4_set,
       Rxstatus & 8 = 8 as 8_set,
       Rxstatus & 16 = 16 as 16_set,
       Rxstatus & 32 = 32 as 32_set,
       Rxstatus & 64 = 64 as 64_set,
       Rxstatus & 128 = 128 as 128_set
from your_table

SQLFiddle演示

您可以将数字转换为二进制,这样您就可以看到设置了哪些位。

为此,您可以使用CONV()函数,例如,您可以将数字49从十进制转换为二进制,如下所示:
SELECT CONV(49,10,2);

导致110001

在回顾了这里的一些答案并与一些同事讨论之后,我们通过检查转换后的长度得到了正确的结果:

LENGTH( CONV( Rxstatus, 10, 2 ) ) NOT IN ( 5, 6, 8 ))

例如,我们使用字段的长度来确定是否设置了数字。如果字段中设置了5、6或8,则必须存在16、32或128。

10000    (Length 5, = 16)
100000   (Length 6, = 32)
10000000 (Length 8, = 128)

长度本身给出了必须设置的值。感谢你们在短短30分钟内解决了这个问题!

超过460,000个字段的查询在0.23秒内运行。: D

最新更新