2012-04-21 96 views
1

我想要有一个字段存储为binary(64)(固定长度),然后我希望能够查询“最接近的匹配”。要做到这一点,我只想找到每个字节之间的绝对差异,然后求和差异。如何计算二进制字段之间的差异?

一个例子瓦特/四字节字符串:

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

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

我使用实体框架,所以最好我写这篇文章的LINQ,但如果这是不可能的,原始SQL是一种可能性。

我并不认为这是非常快的,这就是为什么我计划尽可能先缩小结果,使用另一个关键。这可能在Linq/SQL中做到吗?否则,我想我可以使用64个单字节字段,但我不是真的想手工编写这个代码(我没有办法编写一个循环,是吗?)。

回答

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)

+0

哦,太好了......我也不会弄乱我的数学则:d哈哈...... SQL不会太难以编程生成,但在Linq中没有办法做到这一点吗? – mpen 2012-04-21 03:31:04

+0

不是Linq的专家,我会说你应该可以,因为SQL函数调用仅限于基本的ANSI。 – 2012-04-21 03:37:49