2012-04-21 1 views
1

binary(64)(固定長)として格納されているフィールドを持っていて、「最も近いもの」を照会できるようにしたいと考えています。そうするために、私はちょうど各バイト間の絶対差を見つけて、差を合計したいと思います。 4バイトの文字列/ Wバイナリフィールドの違いを計算する方法は?

例:

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でSQLを実行する方法はありませんか? – mpen

+0

Linqのエキスパートではありませんが、SQL関数呼び出しが基本的なANSIに限定されているため、できるはずです。 –

関連する問題