2012-04-21 93 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