我收到了来自外部来源的数据集,其中包含多个位掩码字段作为 varchars。它们的长度低至 3,长至 21 个值。我需要能够使用 AND 或 OR 逻辑基于这些字段运行 SELECT 查询。
使用计算字段,我只是将位转换为整数值,我可以通过使用简单的 WHERE rowvalue = requestvalue 轻松找到与 AND 查询匹配的行,但 OR 逻辑需要使用按位 & 才能找到匹配记录。
鉴于我需要处理其中的几个列并从数亿条记录中进行选择,我觉得在执行按位和操作来过滤我的 SELECT 结果时会产生巨大的性能损失。
我从搜索中找到了这个答案,看起来它可能符合我的需求,但我需要澄清一下它是如何实现的。
这是否像创建具有所有可能搜索条件的查找表一样简单?
使用 (a & b) 的 3 位示例(编辑:按位操作错误)
001,001
001,011
001,101
001,111
010,010
010,011
010,110
011,011
011,111
etc
Run Code Online (Sandbox Code Playgroud)
作者提到它最初是违反直觉的,但我不禁觉得我对解决方案的解释不正确,因为这会给我一个可能有数十亿行的查找表。
对我上面链接的答案的任何澄清或其他可以保留现有数据库的建议表示赞赏。
编辑:使用小数据的更具体示例。
四个标志,HasHouse、HasCar、HasCat、HasDog,0000 是没有,1111 是全部。
可以翻转任意数量的标志,从全部到无,并且必须过滤选择匹配所有(使用精确值比较)或至少 1(使用按位 &)的结果。
为每个位掩码添加一个计算列是可以的,但是为超过 100 位的每个位添加一列,再加上如何插入/更新数据是我试图寻找替代解决方案的原因。