我正在使用SQL实现一个按位过滤器,我想看看以下优化是否在所有情况下始终有效,并且我不确定如何证明它。 我的目标是限制比较的行数。
标准过滤器伪sql:
IF (A & B = A) // SHOW VALUE
问题是,是否可以添加此功能? :
IF (A = B) OR (A & B = A) WHERE (B >= A) // SHOW VALUE
在我看来,B必须始终是> =到A - 是否有这种情况不属实?
我意识到上面的代码仍然不是最优的,我只是想知道这是否是一个可行的方向。
有人有一些惊人的数学来帮助我吗?
答案 0 :(得分:1)
只要您处理无符号整数(无论是作为mysql中的列类型,还是作为其他dbs中的约束),那么这是真的:
(A & B == A) implies (B >= A) *not* (A >= B)
它的数学运算是B必须包含A组中的所有位,可能还有更多位。如果A中没有设置A的单个位,那么A& B!= A。
(注意反过来并非总是如此:(B> = A)并不意味着(A& B == A)。作为一个简单的反例,5> 3,但是3& 5 = 1。)
此外,一旦你进入负数,你可能会遇到A&amp; B = A,但B <甲
还有一件事:(A&amp; B = A)包括(A = B)的情况,所以说
IF (A = B) OR (A & B = A) ...
是多余的。除非你能看到SQL引擎的速度差异,否则删除(A = B)。