use tmss
go
create table test
(id varchar(50),pic varchar(50), hashcode varchar(16))
insert into test values('1', '2012120910403250c3fa209bf48.jpg', 'bf8f83818080c0f1')
insert into test values('2', '2012120620430750c092db26557.jpg', 'ff9880f0f680ceff')
insert into test values('3', '2012120619582550c08861eb062.jpg', '7f7f004f7f7f7c7f')
insert into test values('4', '2012112911072650b6d16e7f21f.jpg', '7f7f004f7f7f007f')
go
其中pic字段为图片名称,hashcode是图片的感知哈希编码(16进制编码字符串,长度固定16位),用户输入一个hashcode,怎么从数据库中找出满足字符串对应位置的字符不同的个数小于5的记录呢?就像“10111”和“11101”对应位置不同字符不同的个数为2,比如
用户输入"7f7f004f7f7f00af",那么第三条和第四条记录是满足的,怎么实现呢?参数为用户输入的hashcode值,需要写存储过程吗?

解决方案 »

  1.   

    create table test
    (id varchar(50),pic varchar(50), hashcode varchar(16))
    insert into test values('1', '2012120910403250c3fa209bf48.jpg', 'bf8f83818080c0f1')
    insert into test values('2', '2012120620430750c092db26557.jpg', 'ff9880f0f680ceff')
    insert into test values('3', '2012120619582550c08861eb062.jpg', '7f7f004f7f7f7c7f')
    insert into test values('4', '2012112911072650b6d16e7f21f.jpg', '7f7f004f7f7f007f')
    GOcreate FUNCTION f_test(
    @input VARCHAR(50),
    @value VARCHAR(50)
    )
    RETURNS INT
    AS
    BEGIN
    RETURN (SELECT sum(CASE WHEN SUBSTRING(@input,number,1)=SUBSTRING(@value,number,1) THEN 0 ELSE 1 END)
              FROM [master].dbo.spt_values sv WHERE sv.[type]='p' AND LEN(@input)>=number AND sv.number>0 )
    ENDDECLARE @input VARCHAR(50)
    SET @input='7f7f004f7f7f00af'
    SELECT * FROM test t WHERE dbo.f_test(@input,hashcode)<=5
    /*
    id                                                 pic                                                hashcode
    -------------------------------------------------- -------------------------------------------------- ----------------
    3                                                  2012120619582550c08861eb062.jpg                    7f7f004f7f7f7c7f
    4                                                  2012112911072650b6d16e7f21f.jpg                    7f7f004f7f7f007f(2 行受影响)
    */DROP TABLE test
    DROP FUNCTION f_test