创建一个子掩码表以使您的工作更轻松,添加一行
z1 : z2 : z3
0xf : 0xf0 : 0xf00
然后使用以下查询
Select
t.*
from Table t
inner join submasks s
on (
((t.Mask1 & s.z1) = s.z1 || (t.Mask1 & s.z1) = (a00 & s.z1)) &&
((t.Mask1 & s.z2) = s.z2 || (t.Mask1 & s.z2) = (a00 & s.z2)) &&
((t.Mask1 & s.z2) = s.z2 || (t.Mask1 & s.z2) = (a00 & s.z2)) &&
((t.Mask2 & s.z1) = s.z1 || (t.Mask2 & s.z1) = (111 & s.z1)) &&
((t.Mask2 & s.z2) = s.z2 || (t.Mask2 & s.z2) = (111 & s.z2)) &&
((t.Mask2 & s.z2) = s.z2 || (t.Mask2 & s.z2) = (111 & s.z2)) &&
((t.Mask3 & s.z1) = s.z1 || (t.Mask3 & s.z1) = (12 & s.z1)) &&
((t.Mask3 & s.z2) = s.z2 || (t.Mask3 & s.z2) = (12 & s.z2))
)
其工作方式是通过与 执行按位与比较单个十六进制数字z1,z2并z2分别获得 3 个数字中的每一个。
所以
<any value> & z1将除最后一位之外的所有十六进制数字设置为 0,即0x123变为0x003
<any value> & z2将除倒数第二个之外的所有十六进制数字设置为 0,即0x123变为0x020
<any value> & z3将除倒数第三个之外的所有十六进制数字设置为 0,即0x123变为0x100
使用此过滤器,每个数字的测试可以构建为
((mask & filter) = filter) // is the digit f
|| // OR
((mask & filter) = (test & filter)) // is the digit the same.
对 , 和中的每一个重复测试z1,z2并且z3(即0x00f,0x0f0和0xf00)将结果与 and 条件结合起来,您可以检查掩码的所有 3 个十六进制数字是否为f测试值或完全为测试值。
然后对 Mask2 和 Mask3 重复此操作(但只有 z1,z2 因为 Mask3 是 2 位数字)。
通过对子掩码表使用内连接,结果将仅包括掩码条件为真的表中的值。
更新- 您可能想要执行select distinct而不是就像select两个掩码匹配表中的单行,然后将返回 2 个结果。