如何比较长度超过64位的二进制字段

时间:2014-07-08 13:47:55

标签: sql tsql bit-manipulation xor

我有一个新的数据库绑定应用程序。我有一个TableA,其中Column1为二进制(128),始终只包含1个标志。我有另一个TableB,它包含Column5二进制文件(128),其中包含应用于TableA.Column1的位掩码,生成至少有一个标志引发的所有记录。 实施例

TableA
Column1   Record
0000      Product1
0001      Product2
0010      Product3
0100      Product4
1000      Product5

TableB
Column5       Column6
0110          'Cool products'
0101          'Fun products'

申请时

declare @mask as int
select @mask = CAST(TableB.Column5 as int) from TableB WHERE TableB.Column6 = 'Cool products'

select *
from TableA as t
WHERE t.Column1 & @mask <> 0

生产Product3和Product4。一切都按预期工作。为了简化标志分配和风扇性能以及定制搜索掩码的灵活性,我选择了二进制文件。 问题是bigint是64位长,我需要将掩码应用到128位长列,那么我如何实现与上面相同的功能呢?

1 个答案:

答案 0 :(得分:1)

类似

create table #a
(
X varbinary(24) null
)
create table #k
(
K varbinary(24) null
)

select X,K
abs(substring(X,1,8)&cast(substring(K,1,8) as bigint))
+abs(substring(X,9,8)&cast(substring(K,9,8) as bigint))
+abs(substring(X,17,8)&cast(substring(K,17,8) as bigint)) as result
 from #a,#K

但我不鼓励做这样的操作来组织你的分类法。我认为使用关系和常用的SQL技术会好得多 我没有在现实生活中看到任何这种技术导致性能提升的情况。