我希望有一个存储为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个单字节字段,但我真的不想手工编写代码(我无法编写循环,是吗?)。
答案 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)