如何计算二进制字段之间的差异?

时间:2012-04-21 01:05:09

标签: sql sql-server entity-framework linq-to-sql

我希望有一个存储为binary(64)(固定长度)的字段,然后我希望能够查询“最接近的匹配”。为此,我只想找到每个字节之间的绝对差异,然后对差异求和。

带有四字节字符串的示例:

  13 AF 83 52
- E9 B4 9C 19
  -----------
  D6 05 19 39

D6 + 05 + 19 + 39 = 12D = 301 base 10

我正在使用实体框架,所以我最好在Linq中编写它,但如果不可能,那么raw-SQL是可能的。

我不认为这是非常快的,这就是为什么我打算首先使用另一个密钥尽可能地缩小结果。这可以在Linq / SQL中完成吗?

否则,我想我可以使用64个单字节字段,但我真的不想手工编写代码(我无法编写循环,是吗?)。

1 个答案:

答案 0 :(得分:2)

也许是这样的,在4字节的例子中:

DECLARE @b1 BINARY(4)=0x13+0xAF+0x83+0x52;
DECLARE @b2 BINARY(4)=0xE9+0xB4+0x9C+0x19;

SELECT ABS(CAST(SUBSTRING(@b1,1,1) AS INT)-CAST(SUBSTRING(@b2,1,1) AS INT))
+ ABS(CAST(SUBSTRING(@b1,2,1) AS INT)-CAST(SUBSTRING(@b2,2,1) AS INT))
+ ABS(CAST(SUBSTRING(@b1,3,1) AS INT)-CAST(SUBSTRING(@b2,3,1) AS INT))
+ ABS(CAST(SUBSTRING(@b1,4,1) AS INT)-CAST(SUBSTRING(@b2,4,1) AS INT))

结果: 301(基数10)