0

我正在使用 SQL 实现按位过滤器,我想看看以下优化是否在所有情况下都始终有效,但我不确定如何证明它。我的目标是限制比较的行数。

标准过滤伪sql:

IF (A & B = A) // SHOW VALUE

问题是,添加它会起作用吗?:

IF (A = B) OR (A & B = A) WHERE (B >= A) // SHOW VALUE

在我看来,B 必须始终 >= 到 A - 是否存在不正确的情况?

我意识到上面的代码仍然不是最优的,我只是想知道这是否是一个可行的方向。

有人有一些惊人的数学可以帮助我吗?

4

1 回答 1

1

只要您正在处理无符号整数(无论是作为 mysql 中的列类型,还是作为其他 dbs 中的约束),那么这是真的:

(A & B == A) implies (B >= A) *not* (A >= B)

它的数学原理是 B 必须具有 A 集合中的所有位,并且可能更多。如果 A 中的单个位未在 B 中设置,则 A & B != A。

(请注意,反过来并不总是正确的:(B >= A) 并不意味着 (A & B == A)。作为一个简单的反例,5 > 3,但 3 & 5 = 1。)

此外,一旦你进入负数,你可能会遇到 A & B = A,但 B < A 的情况。

还有一件事:(A&B = A)包括(A = B)的情况,所以说

IF (A = B) OR (A & B = A) ...

是多余的。删除 (A = B) 除非您可以看到 SQL 引擎的速度差异。

于 2009-08-12T22:58:10.690 回答