数据表名  sjb     字段  wl(物料编码)  gg(规格)输入一个物料号查找出相应的规格
规格的格式 φ124×12×278  或  φ124×12  
要求是搜索出所有规格相同的数据,问题是
φ124×12×278   相同规格例如 φ124×278×12   φ12×278×124  
φ12×124×278   φ278×124×12  φ278×12×124φ124×12  相同规格例如 12×124

解决方案 »

  1.   

    先把x前后的数字,全部改为按大小顺序重摆
    如φ124×12一律改为φ12×124,而φ12×124就无须改——因为124大于12(可以是数值大小9<10,也可以是字符串大小9>10)不过,我更感兴趣:为什么8年后还有delphi的活?
      

  2.   

    select * from sjb where gg like '%12x124%' or gg like '%124x12% or gg like '%12x278%' or gg like %'124x278%' or ...
      

  3.   

    he delphi 没关系吧,直接使用sql解决么;使用临时表或许方便些,如果使用函数的话 估计会很慢的.
      

  4.   


    我本人的设想是 把规格分拆成124,12,278,然后再组合,最后用SQL写问题是现在忘了怎么把φ124×12×278拆成3个数字,求代码,分不够可再加。
      

  5.   

    最多3个数值?那使用临时增加的3个数值字段,写sql也可能可以做到不过,最好还是程序遍历逐行拆分、排序、update。
      

  6.   

    我本人的设想是 把规格分拆成124,12,278,然后再组合,最后用SQL写问题是现在忘了怎么把φ124×12×278拆成3个数字,求代码,分不够可再加。要拆成3个数字,,只能一步一步分解,最好写成存储过程来调用。
    DECLARE @str varchar(50),@str1 varchar(50),@str2 varchar(50),@str3 varchar(50),@xx intSET @str='φ124×12×278'
    SELECT @str=LTRIM(REPLACE(@str,'φ',' '))SELECT @xx=charindex('×',@str)
    SELECT @str1=Substring(@str,0,@xx)
    SELECT @str=Substring(@str,@xx+1,Len(@Str)-@xx)SELECT @xx=charindex('×',@str)
    SELECT @str2=Substring(@str,0,@xx)
    SELECT @str3=Substring(@str,@xx+1,Len(@Str)-@xx)--print @str1
    --print @str2
    --print @str3
      

  7.   

    根据你的描述:
    需要对查询条件做拆分组合, 如124×12×278, 可得以下因子(暂不考虑规格参数连接符的多样性, 只认可×)
    124, 12, 278(A, B, C)
    可得6种组合  ABC, ACB, BAC, BCA, CAB, CBA
    以这六种组合为查询条件即可.
    分拆规则可根据你的实际使用场景决定.
      

  8.   

     楼主的要求是输入 φ124×12×278 规格条件查询,能把相关的规格都查出来吧可以在查询前就拆分
    部分代码:
    str:='φ124×12×278' ;  // str=要查询的规格
    if Copy(str,1,1)='φ' then str:=Copy(str,2,Length(str)-1);   // 去掉前面的φ符号iPoint:=point('x',str);  // 取第一个x的位置
    if iPoint>0 then s1:=Copy(str,1,iPoint-1);   // 第一个规格字符串str:=Copy(str,iPoint+1,Length(str)-iPoint);
    iPoint:=point('x',str);  // 取第二个x的位置
    if iPoint>0 then
    begin
       s2:=Copy(str,1,iPoint-1);   // 第二个规格字符串
       s3:=Copy(str,iPoint+1,Length(str)-iPoint);   // 第三个规格字符串
    end
    else
    begin  //  只有两个字符串的规格
      s2:=str;
      s3:='';
    end;查询语句:
    要分两种情况,一种是s3不为空,一种是s3为空
    if s3<>'' then  // 一共9种组合
      sql.text:='select * from sjb where (gg like ''%'+s1+'x'+s2+'x'+s3+'%'') or (gg like ''%'+s1+'x'+s3+'x'+s2+'%'') or ...'
    end
    else   //  2种组合
      sql.text:='select * from sjb where (gg =''φ'+s1+'x'+s2+''') or (gg =''φ'+s2+'x'+s1+''')';
      

  9.   

    前面查询语句有误:都要用like ,因为有些有φ符号,有些没有
    要分两种情况,一种是s3不为空,一种是s3为空
    if s3<>'' then  // 一共9种组合
      sql.text:='select * from sjb where (gg like ''%'+s1+'x'+s2+'x'+s3+'%'') or (gg like ''%'+s1+'x'+s3+'x'+s2+'%'') or ...'
    end
    else   //  2种组合
      sql.text:='select * from sjb where (gg like '%''+s1+'x'+s2+'%'') or (gg like '%''+s2+'x'+s1+'%'')';
      

  10.   

    我赞成13楼的。输入时,只要不脱离大方向,φ124×12×278、φ124×278×12、φ12×124×278等都行。
    查询时,无论输入上述几种那一种都行。这样对用户特别方便(不要苛求用户非按什么格式、顺序输入)。编程者所要做的就是,在查询前将φ124×12×278拆分成所有可能的组合,好像有6种?再查询就行。
    where (gg like ‘φ124×12×278’) or (gg like ‘φ124×278×12’) or (gg like ‘φ12×124×278’) or (gg like ...) or ...
      

  11.   

    先把输入的字符串按照X分成几个片段(X就不算在里面了)
    譬如12X23X34,变成这么一个数组12, 23, 34,然后查询的时候就
    where ... 
    ( ('X'+field +'X') like ('%'+'X'+12+'X'+'%')
     or ('X'+field +'X') like ('%'+'X'+23+'X'+'%')
     or ('X'+field +'X') like ('%'+'X'+34+'X'+'%')
    )
    ...
      

  12.   

    sorry写错了,应该用and, 不是or