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

Sql 如何比较长度超过64位的二进制字段,sql,tsql,bit-manipulation,xor,Sql,Tsql,Bit Manipulation,Xor,我有一个新的数据库绑定应用程序。我有一个表,列1是二进制的(128),它总是只包含1个标记。我还有另一个TableB,它包含Column5二进制文件(128),其中包含位掩码,当应用于TableA.Column1时,它会生成至少有一个标志被提升的所有记录。 范例 应用时 declare @mask as int select @mask = CAST(TableB.Column5 as int) from TableB WHERE TableB.Column6 = 'Cool products'

我有一个新的数据库绑定应用程序。我有一个表,列1是二进制的(128),它总是只包含1个标记。我还有另一个TableB,它包含Column5二进制文件(128),其中包含位掩码,当应用于TableA.Column1时,它会生成至少有一个标志被提升的所有记录。 范例

应用时

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
将@mask声明为int
从TableB中选择@mask=CAST(TableB.Column5为int),其中TableB.Column6='Cool products'
挑选*
从表A到表t
其中t.Column1和@mask 0
生产产品3和产品4。一切按计划进行。我选择二进制是为了标志分配的简单性、扇形性能和定制搜索掩码的灵活性。 问题是bigint是64位长的,我需要对128位长的列应用掩码,那么如何实现上述相同的功能

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技术会更好。

在现实生活中,我没有见过这样的技术会带来性能提升的情况。

你是说128种产品对每个人都足够了吗?SQL建模的方法是将这些关系建模为表数据,在适当的列中。你确定你需要以“性能”的名义摧毁传统的查询功能吗?@Damien_the_unsiver-不,128种产品是不够的。这实际上是生产中使用的原材料的特性。但在生产过程中,一个属性可以转换为另一个属性,因此需要使用掩码对它们进行分组。随着规格的变化,包含的材料属性也会发生变化,因此搜索掩码也是,
^
是独占的,因此它不会执行您认为的操作-显示的查询将始终检索所有行,只要表B位掩码包含多个集合位,而表A位掩码仅包含一个集合位。由于产品1未设置任何位,因此不太确定如何使用它。在
表a中,您有
列1
,它是一个
BIGINT
,可以设置64个标志。用另一个
BIGINT
添加
Column1A
,这样就可以有另外64个标志。然后
TableB
也需要两列相同的方式(
Column5
Column5A
)。然后,您可以将
表a.Column1
表b.Column5
进行比较,将
表a.Column1A
表b.Column5A
进行比较。
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