在一个表中查找和 5916668 最相似的数
表中有数据
5
59
5916
591查询结果是 5916

解决方案 »

  1.   

    var
      sqltext,str1,str2: string;
      i,l: integer;
    begin
      str:= '5916668';
      seltext:= 'select max(id) from table1 where 1=1 and id like ';
      for i:= 1 to length(str1) do
        begin
          str2:= str1[i] + '%';
          adoquery1.sql.text:= sqltext + ' and id like ''' + str2+ '''';
        end;
      adoquery1.open;
      ...
    end;
      

  2.   

    同LS用循环去解决...
    不过可能用SQL去处理更好一些,后台存储过程去做吧。
      

  3.   

    你到SQL版块去问可能会更好的答案...
      

  4.   

    var 
      sqltext,str1,str2: string; 
      i,l: integer; 
    begin 
      str:= '5916668'; 
      seltext:= 'select max(id) from table1 where 1=1 and id like '; 
      for i:= 1 to length(str1) do 
        begin 
          str2:= '%' + copy(str1,1,i) + '%'; 
          adoquery1.sql.text:= sqltext + ' and id like ''' + str2+ ''''; 
        end; 
      adoquery1.open; 
      ... 
    end;
      

  5.   

    相似的规则是:只能从最左边开始?用sql实现:
    select f1,len(f1) fLen
    from tb
    where f1=left('51966668',len(f1))
    order by fLen desc
      

  6.   

    如果只要最相似的,就top 1
      

  7.   


    DECLARE @T TABLE (name VARCHAR(10))
    INSERT INTO @T
    select 5 union all
    select 59 union all
    select 5916 union all
    select 591                select max(name)
    from @T
    where name like '%5%' or name like '%51%' or name like '%519%'
    or name like '%5196%' or name like '%51966%'  -- 更长的-- result 5916
    var 
      sqltext,str1,str2: string; 
      i,l: integer; 
    begin 
      str:= '5916668'; 
      seltext:= 'select max(id) from table1 where 1=1 '; 
      for i:= 1 to length(str1) do 
        begin 
          str2:= '%' + copy(str1,1,i) + '%'; 
          adoquery1.sql.text:= sqltext + ' or id like ''' + str2+ ''''; 
        end; 
      adoquery1.open; 
      ... 
    end;