有没有一种方法可以检查一个位是否置1,而另一个则不设置?

时间:2020-10-20 14:38:09

标签: sql bit-manipulation

很抱歉,以前可能有人问过这个问题,但是很难搜索。我试图弄清楚是否已在单个操作中设置了一些位,而未设置一些位。这可能吗?

例如我想检查第五位是否关闭,但是第二位或第三位是否打开。

1 个答案:

答案 0 :(得分:1)

对于您建议的SQL情况,您可以屏蔽掉这三位并执行IN检查所接受的模式,例如

SELECT * FROM table
WHERE (field & 0x16) IN (0x2, 0x4);

或者如果您一次接受设置的第二位和第三位,则可以进行范围检查,因为您接受的所有三个组合都不会与不接受的选项的范围重叠:

SELECT * FROM table
WHERE (field & 0x16) BETWEEN 0x2 AND 0x6;

我会注意到,尽管这行得通,但对于SQL(或实际上是任何一种语言)而言,这并不是很好的样式。实际上,您可能希望坚持使用命名的单个BITNOT NULL)字段,该字段为SQL提供了更多信息(可能允许索引搜索等)。写作

SELECT * FROM table
WHERE (field2 = 1 OR field3 = 1) AND field5 = 0;

-- or for mutually exclusive
WHERE field2 + field3 = 1 AND field5 = 0;

不会有意义地更长,并且可以清楚地知道您在做什么(假设您当然拥有更多有用的字段名称)。